diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-09-28 03:18:53 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-09-28 03:18:53 +0000 |
| commit | cff420120f944b012850ba279f0ec50b72571aca (patch) | |
| tree | 61196ea6f562b5256adeaaa06d97303eb4f63de0 /clang | |
| parent | 2fc9c3b05f3f7888d0d263e9ff5f143a7611cd36 (diff) | |
| download | bcm5719-llvm-cff420120f944b012850ba279f0ec50b72571aca.tar.gz bcm5719-llvm-cff420120f944b012850ba279f0ec50b72571aca.zip | |
Handle dependent class template names in class template argument
deduction for new-expressions.
llvm-svn: 343293
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 5 | ||||
| -rw-r--r-- | clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp | 7 |
2 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index a678a31a5ac..958dd66612c 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -9155,8 +9155,11 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer( TSInfo->getType()->getContainedDeducedType()); assert(DeducedTST && "not a deduced template specialization type"); - // We can only perform deduction for class templates. auto TemplateName = DeducedTST->getTemplateName(); + if (TemplateName.isDependent()) + return Context.DependentTy; + + // We can only perform deduction for class templates. auto *Template = dyn_cast_or_null<ClassTemplateDecl>(TemplateName.getAsTemplateDecl()); if (!Template) { diff --git a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp index cbf7c2eee51..c310c651408 100644 --- a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp +++ b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp @@ -307,6 +307,13 @@ namespace dependent { template int Var(int); template int Cast(int); template int New(int); + + template<template<typename> typename Y> void test() { + Y(0); + new Y(0); + Y y(0); + } + template void test<X>(); } namespace injected_class_name { |

