Hi rnk,

The call to cast crashes because getTemplateDecl returns null for 
TemplateTemplateParmDecls.

http://reviews.llvm.org/D4992

Files:
  lib/Sema/SemaDecl.cpp
  test/SemaTemplate/ms-lookup-template-base-classes.cpp

Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -150,7 +150,7 @@
     if (!TST || !TST->isDependentType())
       continue;
     auto *TD = TST->getTemplateName().getAsTemplateDecl();
-    if (!TD)
+       if (!TD || !TD->getTemplatedDecl())
       continue;
     auto *BasePrimaryTemplate = cast<CXXRecordDecl>(TD->getTemplatedDecl());
     // FIXME: Allow lookup into non-dependent bases of dependent bases, 
possibly
Index: test/SemaTemplate/ms-lookup-template-base-classes.cpp
===================================================================
--- test/SemaTemplate/ms-lookup-template-base-classes.cpp
+++ test/SemaTemplate/ms-lookup-template-base-classes.cpp
@@ -460,3 +460,19 @@
   int x = f<NameFromBase>();
 };
 }
+
+namespace PR20716 {
+template <class T>
+struct A
+{
+  void foo() {}
+};
+
+template <template <typename T> class C>
+struct B : public C<int>
+{
+  void bar() {
+    foo();
+  }
+};
+}
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -150,7 +150,7 @@
     if (!TST || !TST->isDependentType())
       continue;
     auto *TD = TST->getTemplateName().getAsTemplateDecl();
-    if (!TD)
+	if (!TD || !TD->getTemplatedDecl())
       continue;
     auto *BasePrimaryTemplate = cast<CXXRecordDecl>(TD->getTemplatedDecl());
     // FIXME: Allow lookup into non-dependent bases of dependent bases, possibly
Index: test/SemaTemplate/ms-lookup-template-base-classes.cpp
===================================================================
--- test/SemaTemplate/ms-lookup-template-base-classes.cpp
+++ test/SemaTemplate/ms-lookup-template-base-classes.cpp
@@ -460,3 +460,19 @@
   int x = f<NameFromBase>();
 };
 }
+
+namespace PR20716 {
+template <class T>
+struct A
+{
+  void foo() {}
+};
+
+template <template <typename T> class C>
+struct B : public C<int>
+{
+  void bar() {
+    foo();
+  }
+};
+}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to