]> granicus.if.org Git - clang/commitdiff
[CodeCompletion] Don't crash on member inits of templated constructors.
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 9 Jul 2015 15:31:10 +0000 (15:31 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 9 Jul 2015 15:31:10 +0000 (15:31 +0000)
Also fixes a crash (on invalid) member functions with a colon
initializer. PR23948.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241811 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaCodeComplete.cpp
test/Index/complete-ctor-inits.cpp

index 252e30563e3a51d4e4068c06fb61f938b923f9c2..86265275d05e837ef1920bce6df91bc7fa8ef5ce 100644 (file)
@@ -4409,9 +4409,12 @@ void Sema::CodeCompleteOperatorName(Scope *S) {
 void Sema::CodeCompleteConstructorInitializer(
                               Decl *ConstructorD,
                               ArrayRef <CXXCtorInitializer *> Initializers) {
-  PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
-  CXXConstructorDecl *Constructor
-    = static_cast<CXXConstructorDecl *>(ConstructorD);
+  if (!ConstructorD)
+    return;
+
+  AdjustDeclIfTemplate(ConstructorD);
+
+  CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
   if (!Constructor)
     return;
   
@@ -4435,6 +4438,7 @@ void Sema::CodeCompleteConstructorInitializer(
   // Add completions for base classes.
   CodeCompletionBuilder Builder(Results.getAllocator(),
                                 Results.getCodeCompletionTUInfo());
+  PrintingPolicy Policy = getCompletionPrintingPolicy(*this);
   bool SawLastInitializer = Initializers.empty();
   CXXRecordDecl *ClassDecl = Constructor->getParent();
   for (const auto &Base : ClassDecl->bases()) {
index f50621466f1ee26681075dd741bc9ccbfca11472..0870cb2f823e97fc36fd3e3a480d7ee338acafd5 100644 (file)
@@ -17,6 +17,18 @@ struct Z : public X<int>, public Y {
 
 Z::Z() : ::X<int>(0), Virt(), b(), c() { }
 
+struct PR23948 {
+  template<class size> PR23948()
+        :
+  {}
+
+  template<class size> void invalid()
+        :
+  {}
+
+  int a;
+};
+
 // RUN: c-index-test -code-completion-at=%s:18:10 %s | FileCheck -check-prefix=CHECK-CC1 %s
 // CHECK-CC1: MemberRef:{TypedText a}{LeftParen (}{Placeholder args}{RightParen )} (35)
 // CHECK-CC1: MemberRef:{TypedText b}{LeftParen (}{Placeholder args}{RightParen )} (35)
@@ -38,3 +50,7 @@ Z::Z() : ::X<int>(0), Virt(), b(), c() { }
 // CHECK-CC3: MemberRef:{TypedText c}{LeftParen (}{Placeholder args}{RightParen )} (7)
 // CHECK-CC3-NOT: NotImplemented:{TypedText Virt}{LeftParen (}{Placeholder args}{RightParen )}
 // CHECK-CC3: NotImplemented:{TypedText Y}{LeftParen (}{Placeholder args}{RightParen )} (35)
+
+// RUN: c-index-test -code-completion-at=%s:22:10 %s | FileCheck -check-prefix=CHECK-CC4 %s
+// CHECK-CC4: MemberRef:{TypedText a}{LeftParen (}{Placeholder args}{RightParen )} (7)
+// RUN: c-index-test -code-completion-at=%s:26:10 %s