]> granicus.if.org Git - clang/commitdiff
PR20716 - Crash when recovering from type in known dependent base.
authorNikola Smiljanic <popizdeh@gmail.com>
Sun, 24 Aug 2014 23:28:47 +0000 (23:28 +0000)
committerNikola Smiljanic <popizdeh@gmail.com>
Sun, 24 Aug 2014 23:28:47 +0000 (23:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216352 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclTemplate.h
lib/Sema/SemaDecl.cpp
test/SemaTemplate/ms-lookup-template-base-classes.cpp

index 980a06e35b70d654fec91d890dc4879e305cdae7..7c0da8ff0cea5fa46d7f5a557eafd1388504dab2 100644 (file)
@@ -236,7 +236,7 @@ protected:
       TemplateParams(nullptr) {}
 
   // Construct a template decl with the given name and parameters.
-  // Used when there is not templated element (tt-params, alias?).
+  // Used when there is not templated element (tt-params).
   TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L,
                DeclarationName Name, TemplateParameterList *Params)
     : NamedDecl(DK, DC, L, Name), TemplatedDecl(nullptr),
index 0244d4c4a307770f01b811ab841b5947b69dde72..5293188214c3cf4c677f51fed05d2cb05043a60c 100644 (file)
@@ -152,7 +152,10 @@ static ParsedType recoverFromTypeInKnownDependentBase(Sema &S,
     auto *TD = TST->getTemplateName().getAsTemplateDecl();
     if (!TD)
       continue;
-    auto *BasePrimaryTemplate = cast<CXXRecordDecl>(TD->getTemplatedDecl());
+    auto *BasePrimaryTemplate =
+        dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl());
+    if (!BasePrimaryTemplate)
+      continue;
     // FIXME: Allow lookup into non-dependent bases of dependent bases, possibly
     // by calling or integrating with the main LookupQualifiedName mechanism.
     for (NamedDecl *ND : BasePrimaryTemplate->lookup(&II)) {
index 4bdb97bbbd105041efbe11c1e3c154754c9143bc..979782f1cba8c2d4317f10925ee4d1a1a9609066 100644 (file)
@@ -470,3 +470,23 @@ void f() {
   UndefVar.method(); // expected-error {{use of undeclared identifier 'UndefVar'}}
 }
 }
+
+namespace PR20716 {
+template <template <typename T> class A>
+struct B : A<int>
+{
+  XXX x; // expected-error {{unknown type name}}
+};
+
+template <typename T>
+struct C {};
+
+template <typename T>
+using D = C<T>;
+
+template <typename T>
+struct E : D<T>
+{
+  XXX x; // expected-error {{unknown type name}}
+};
+}