]> granicus.if.org Git - clang/commitdiff
Handle dependent class template names in class template argument
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 28 Sep 2018 03:18:53 +0000 (03:18 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 28 Sep 2018 03:18:53 +0000 (03:18 +0000)
deduction for new-expressions.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@343293 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp
test/SemaCXX/cxx1z-class-template-argument-deduction.cpp

index a678a31a5ac4b0ca3e13d1189e242ab198de6638..958dd66612c7e353e8a47f19f467f7994277a184 100644 (file)
@@ -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) {
index cbf7c2eee51cdef578c1bf6c43c755f286190d68..c310c651408d6361d8d02e08fe5e5509f91c73c3 100644 (file)
@@ -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 {