summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2018-09-28 03:18:53 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2018-09-28 03:18:53 +0000
commitcff420120f944b012850ba279f0ec50b72571aca (patch)
tree61196ea6f562b5256adeaaa06d97303eb4f63de0 /clang
parent2fc9c3b05f3f7888d0d263e9ff5f143a7611cd36 (diff)
downloadbcm5719-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.cpp5
-rw-r--r--clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp7
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 {
OpenPOWER on IntegriCloud