diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-05-30 20:24:10 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-05-30 20:24:10 +0000 |
commit | 2600c63d968f9f58751a8bcdd6d48e08b55e7649 (patch) | |
tree | 44a3175b176a2289217f68a6eda673de6d1751db | |
parent | 936d50aeea856fde070ba17571e48e9713047550 (diff) | |
download | bcm5719-llvm-2600c63d968f9f58751a8bcdd6d48e08b55e7649.tar.gz bcm5719-llvm-2600c63d968f9f58751a8bcdd6d48e08b55e7649.zip |
PR34520: after instantiating a non-templated member deduction guide, don't forget to push it into the class scope.
llvm-svn: 333589
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 5 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp | 12 |
2 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index cd80215d044..dd62d4c98f3 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -2833,7 +2833,10 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D) { Decl * TemplateDeclInstantiator::VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D) { - return VisitFunctionDecl(D, nullptr); + Decl *Inst = VisitFunctionDecl(D, nullptr); + if (Inst && !D->getDescribedFunctionTemplate()) + Owner->addDecl(Inst); + return Inst; } Decl *TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D) { diff --git a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp index d21fbf28928..90f168d3fcc 100644 --- a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp +++ b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp @@ -320,6 +320,18 @@ namespace injected_class_name { using T = decltype(b); } +namespace member_guides { + // PR34520 + template<class> + struct Foo { + template <class T> struct Bar { + Bar(...) {} + }; + Bar(int) -> Bar<int>; + }; + Foo<int>::Bar b = 0; +} + #else // expected-no-diagnostics |