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