r343293 - Handle dependent class template names in class template argument

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 27 20:18:53 PDT 2018


Author: rsmith
Date: Thu Sep 27 20:18:53 2018
New Revision: 343293

URL: http://llvm.org/viewvc/llvm-project?rev=343293&view=rev
Log:
Handle dependent class template names in class template argument
deduction for new-expressions.

Modified:
    cfe/trunk/lib/Sema/SemaInit.cpp
    cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp

Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=343293&r1=343292&r2=343293&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Thu Sep 27 20:18:53 2018
@@ -9155,8 +9155,11 @@ QualType Sema::DeduceTemplateSpecializat
       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) {

Modified: cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp?rev=343293&r1=343292&r2=343293&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp Thu Sep 27 20:18:53 2018
@@ -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 {




More information about the cfe-commits mailing list