[PATCH] D30248: [libclang] Fix crash in member access code completion with implicit base

2017-03-28 Thread Erik Verbruggen via Phabricator via cfe-commits
erikjv closed this revision.
erikjv added a comment.

Landed as r298903.


https://reviews.llvm.org/D30248



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D30248: [libclang] Fix crash in member access code completion with implicit base

2017-03-27 Thread Benjamin Kramer via Phabricator via cfe-commits
bkramer accepted this revision.
bkramer added a comment.
This revision is now accepted and ready to land.

Let's fix those crashes one at a time. This patch looks good, only minor 
comments below.




Comment at: lib/Sema/SemaOverload.cpp:6311
+  if (isa(FD) && !cast(FD)->isStatic()) {
+QualType ObjectType;
+Expr::Classification ObjectClassification;

This could use a comment explaining that this can happen if there's an error in 
the code, e.g. in code completion context.



Comment at: lib/Sema/SemaOverload.cpp:6329
+  !cast(FunTmpl->getTemplatedDecl())->isStatic()) {
+QualType ObjectType;
+Expr::Classification ObjectClassification;

Same here.


https://reviews.llvm.org/D30248



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D30248: [libclang] Fix crash in member access code completion with implicit base

2017-02-22 Thread Alex Lorenz via Phabricator via cfe-commits
arphaman added a comment.

It seems that unresolved member expressions have other lookup issues. For 
example, this will crash when code-completing as well:

  struct Foo {
void foo() const;
static void foo(bool);
  };
  
  struct Bar: Foo {
void foo(bool param) {
  this->Foo::foo(/*CC CRASH*/  );// unresolved member expression with an 
explicit base
}
  };

Are we sure that a call to `AddFunctionCandidates` is the right way to gather 
the method overloads in this particular instance?


https://reviews.llvm.org/D30248



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D30248: [libclang] Fix crash in member access code completion with implicit base

2017-02-22 Thread Erik Verbruggen via Phabricator via cfe-commits
erikjv created this revision.

If there is an unresolved member access AST node, and the base is
implicit, do not access/use it for generating candidate overloads for
code completion results (because the base is a nullptr).

Fixes PR31093.


https://reviews.llvm.org/D30248

Files:
  lib/Sema/SemaCodeComplete.cpp
  lib/Sema/SemaOverload.cpp
  test/CodeCompletion/member-access.cpp

Index: test/CodeCompletion/member-access.cpp
===
--- test/CodeCompletion/member-access.cpp
+++ test/CodeCompletion/member-access.cpp
@@ -37,6 +37,17 @@
   }
 };
 
+struct Foo {
+  void foo() const;
+  static void foo(bool);
+};
+
+struct Bar {
+  void foo(bool param) {
+Foo::foo(  );// unresolved member expression with an implicit base
+  }
+};
+
   // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:29:6 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
   // CHECK-CC1: Base1 : Base1::
   // CHECK-CC1: member1 : [#int#][#Base1::#]member1
@@ -52,3 +63,6 @@
 
 // Make sure this doesn't crash
 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:36:7 %s -verify
+
+// Make sure this also doesn't crash
+// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:47:14 %s
Index: lib/Sema/SemaOverload.cpp
===
--- lib/Sema/SemaOverload.cpp
+++ lib/Sema/SemaOverload.cpp
@@ -6307,30 +6307,43 @@
   for (UnresolvedSetIterator F = Fns.begin(), E = Fns.end(); F != E; ++F) {
 NamedDecl *D = F.getDecl()->getUnderlyingDecl();
 if (FunctionDecl *FD = dyn_cast(D)) {
-  if (isa(FD) && !cast(FD)->isStatic())
+  if (isa(FD) && !cast(FD)->isStatic()) {
+QualType ObjectType;
+Expr::Classification ObjectClassification;
+if (Expr *E = Args[0]) {
+  ObjectType = E->getType();
+  ObjectClassification = E->Classify(Context);
+}
 AddMethodCandidate(cast(FD), F.getPair(),
-   cast(FD)->getParent(),
-   Args[0]->getType(), Args[0]->Classify(Context),
-   Args.slice(1), CandidateSet, SuppressUserConversions,
-   PartialOverloading);
-  else
+   cast(FD)->getParent(), ObjectType,
+   ObjectClassification, Args.slice(1), CandidateSet,
+   SuppressUserConversions, PartialOverloading);
+  } else {
 AddOverloadCandidate(FD, F.getPair(), Args, CandidateSet,
  SuppressUserConversions, PartialOverloading);
+  }
 } else {
   FunctionTemplateDecl *FunTmpl = cast(D);
   if (isa(FunTmpl->getTemplatedDecl()) &&
-  !cast(FunTmpl->getTemplatedDecl())->isStatic())
+  !cast(FunTmpl->getTemplatedDecl())->isStatic()) {
+QualType ObjectType;
+Expr::Classification ObjectClassification;
+if (Expr *E = Args[0]) {
+  ObjectType = E->getType();
+  ObjectClassification = E->Classify(Context);
+}
 AddMethodTemplateCandidate(
 FunTmpl, F.getPair(),
 cast(FunTmpl->getDeclContext()),
-ExplicitTemplateArgs, Args[0]->getType(),
-Args[0]->Classify(Context), Args.slice(1), CandidateSet,
-SuppressUserConversions, PartialOverloading);
-  else
+ExplicitTemplateArgs, ObjectType, ObjectClassification,
+Args.slice(1), CandidateSet, SuppressUserConversions,
+PartialOverloading);
+  } else {
 AddTemplateOverloadCandidate(FunTmpl, F.getPair(),
  ExplicitTemplateArgs, Args,
  CandidateSet, SuppressUserConversions,
  PartialOverloading);
+  }
 }
   }
 }
Index: lib/Sema/SemaCodeComplete.cpp
===
--- lib/Sema/SemaCodeComplete.cpp
+++ lib/Sema/SemaCodeComplete.cpp
@@ -4309,7 +4309,8 @@
   UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
   TemplateArgs = 
 }
-SmallVector ArgExprs(1, UME->getBase());
+SmallVector ArgExprs(
+1, UME->isImplicitAccess() ? nullptr : UME->getBase());
 ArgExprs.append(Args.begin(), Args.end());
 UnresolvedSet<8> Decls;
 Decls.append(UME->decls_begin(), UME->decls_end());
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits