]> granicus.if.org Git - clang/commitdiff
[Sema] Fix crash in getConstructorName.
authorIlya Biryukov <ibiryukov@google.com>
Wed, 4 Jul 2018 08:50:12 +0000 (08:50 +0000)
committerIlya Biryukov <ibiryukov@google.com>
Wed, 4 Jul 2018 08:50:12 +0000 (08:50 +0000)
Summary:
Can happen when getConstructorName is called on invalid decls,
specifically the ones that do not have the injected class name.

Reviewers: bkramer, rsmith

Reviewed By: rsmith

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D48880

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

lib/Sema/SemaExprCXX.cpp
test/SemaCXX/injected-class-name-crash.cpp [new file with mode: 0644]

index db47931348d65e46dee9b9010033827c4639d4d9..8dd9c19bd3763cc3a95f247cdd5a01ed5e75ae4b 100644 (file)
@@ -113,6 +113,8 @@ ParsedType Sema::getConstructorName(IdentifierInfo &II,
       break;
     }
   }
+  if (!InjectedClassName && CurClass->isInvalidDecl())
+    return ParsedType();
   assert(InjectedClassName && "couldn't find injected class name");
 
   QualType T = Context.getTypeDeclType(InjectedClassName);
diff --git a/test/SemaCXX/injected-class-name-crash.cpp b/test/SemaCXX/injected-class-name-crash.cpp
new file mode 100644 (file)
index 0000000..2996a7c
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+template <class T>
+struct X : public Foo<Bar { // expected-error {{unknown template name 'Foo'}} expected-error {{use of undeclared identifier 'Bar'}}
+  X();
+}; // expected-error {{expected '{' after base class list}}
+
+
+template <class T>
+X<T>::X() {
+}