]> granicus.if.org Git - clang/commitdiff
Per [temp.deduct.call], do not deduce an array bound of 0 from an empty initializer...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 5 Jan 2017 04:16:30 +0000 (04:16 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 5 Jan 2017 04:16:30 +0000 (04:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@291075 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaTemplateDeduction.cpp
test/SemaTemplate/deduction.cpp

index 35f2de16828df3cb4e512d1fe1316eefa6f449ac..6c90b5c2266de77a38d1330dada571fb5cc91ecc 100644 (file)
@@ -3219,6 +3219,9 @@ static Sema::TemplateDeductionResult DeduceFromInitializerList(
   //   parameter type and the initializer element as its argument
   //
   // We've already removed references and cv-qualifiers here.
+  if (!ILE->getNumInits())
+    return Sema::TDK_Success;
+
   QualType ElTy;
   auto *ArrTy = S.Context.getAsArrayType(AdjustedParamType);
   if (ArrTy)
@@ -3241,7 +3244,6 @@ static Sema::TemplateDeductionResult DeduceFromInitializerList(
 
   //   in the P0[N] case, if N is a non-type template parameter, N is deduced
   //   from the length of the initializer list.
-  // FIXME: We're not supposed to get here if N would be deduced as 0.
   if (auto *DependentArrTy = dyn_cast_or_null<DependentSizedArrayType>(ArrTy)) {
     // Determine the array bound is something we can deduce.
     if (NonTypeTemplateParmDecl *NTTP =
index f98fd9bea0c7c7e0a51069dc0587f0df38ddc137..940f6018f20c0a49ec6a1e6c94d7869c07d02ede 100644 (file)
@@ -414,3 +414,17 @@ namespace b29946541 {
   void f(C<T, U>); // expected-note {{failed template argument deduction}}
   void g(A<int> a) { f(a); } // expected-error {{no match}}
 }
+
+namespace deduction_from_empty_list {
+  template<int M, int N = 5> void f(int (&&)[N], int (&&)[N]) { // expected-note {{1 vs. 2}}
+    static_assert(M == N, "");
+  }
+
+  void test() {
+    f<5>({}, {});
+    f<1>({}, {0});
+    f<1>({0}, {});
+    f<1>({0}, {0});
+    f<1>({0}, {0, 1}); // expected-error {{no matching}}
+  }
+}