diff options
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 13 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/instantiate-local-class.cpp | 15 |
2 files changed, 19 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 7b84a06eaa8..6439b9208c4 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -1187,14 +1187,11 @@ Decl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) { // DR1484 clarifies that the members of a local class are instantiated as part // of the instantiation of their enclosing entity. if (D->isCompleteDefinition() && D->isLocalClass()) { - if (SemaRef.InstantiateClass(D->getLocation(), Record, D, TemplateArgs, - TSK_ImplicitInstantiation, - /*Complain=*/true)) { - llvm_unreachable("InstantiateClass shouldn't fail here!"); - } else { - SemaRef.InstantiateClassMembers(D->getLocation(), Record, TemplateArgs, - TSK_ImplicitInstantiation); - } + SemaRef.InstantiateClass(D->getLocation(), Record, D, TemplateArgs, + TSK_ImplicitInstantiation, + /*Complain=*/true); + SemaRef.InstantiateClassMembers(D->getLocation(), Record, TemplateArgs, + TSK_ImplicitInstantiation); } return Record; } diff --git a/clang/test/SemaTemplate/instantiate-local-class.cpp b/clang/test/SemaTemplate/instantiate-local-class.cpp index 2bf24c2188e..c9897b9c614 100644 --- a/clang/test/SemaTemplate/instantiate-local-class.cpp +++ b/clang/test/SemaTemplate/instantiate-local-class.cpp @@ -1,5 +1,4 @@ // RUN: %clang_cc1 -verify -std=c++11 %s -// expected-no-diagnostics template<typename T> void f0() { struct X; @@ -181,3 +180,17 @@ namespace PR14373 { return 0; } } + +namespace PR18907 { +template <typename> +class C : public C<int> {}; // expected-error{{within its own definition}} + +template <typename X> +void F() { + struct A : C<X> {}; +} + +struct B { + void f() { F<int>(); } +}; +} |

