diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-01-04 01:24:17 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-01-04 01:24:17 +0000 |
commit | 1337318eea74661a993023f657e4d15da8463945 (patch) | |
tree | 8ff00b6f20fb9b3167e7cb00e69413975cce268c /clang | |
parent | 8fbad0a4c208f4d30ae6274e1c9f663b143f46be (diff) | |
download | llvm-1337318eea74661a993023f657e4d15da8463945.zip llvm-1337318eea74661a993023f657e4d15da8463945.tar.gz llvm-1337318eea74661a993023f657e4d15da8463945.tar.bz2 |
PR35045: Convert injected-class-name to its corresponding simple-template-id
during template argument deduction.
We already did this when the injected-class-name was in P, but missed the case
where it was in A. This (probably) can't happen except in implicit deduction
guides.
llvm-svn: 321779
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaTemplateDeduction.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp | 11 |
2 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 3a0f2ff..d09cf99 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -502,6 +502,10 @@ DeduceTemplateArguments(Sema &S, SmallVectorImpl<DeducedTemplateArgument> &Deduced) { assert(Arg.isCanonical() && "Argument type must be canonical"); + // Treat an injected-class-name as its underlying template-id. + if (auto *Injected = dyn_cast<InjectedClassNameType>(Arg)) + Arg = Injected->getInjectedSpecializationType(); + // Check whether the template argument is a dependent template-id. if (const TemplateSpecializationType *SpecArg = dyn_cast<TemplateSpecializationType>(Arg)) { diff --git a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp index 9080f67..d21fbf2 100644 --- a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp +++ b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp @@ -309,6 +309,17 @@ namespace dependent { template int New(int); } +namespace injected_class_name { + template<typename T = void> struct A { + A(); + template<typename U> A(A<U>); + }; + A<int> a; + A b = a; + using T = decltype(a); + using T = decltype(b); +} + #else // expected-no-diagnostics |