[PATCH] D42664: Fix explicit template parameter reporting for narrowing conversions

Erich Keane via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 29 15:08:18 PST 2018


erichkeane created this revision.
erichkeane added reviewers: rsmith, dblaikie, rnk.

I found that explicit template parameters that caused a 
narrowing integer conversion resulted in the incorrect parameter
being mentioned in the note (see test attached).  This is because
the argument checking code doesn't check to see if it caused
SFINAE errors when checking the arguments, so instead of giving
up on the first error, it continues through the list.  This 
makes the error reporting pick up the last template param every time.

This patch checks these parameters on each argument and gives up
if there is an error. The result is that only the required amount 
of arguments are checked, and that the 'Converted' array contains
only the successful arguments before the first failure, as the
calls seem to all expect.


https://reviews.llvm.org/D42664

Files:
  lib/Sema/SemaTemplate.cpp
  test/SemaTemplate/temp_arg_nontype_cxx11.cpp


Index: lib/Sema/SemaTemplate.cpp
===================================================================
--- lib/Sema/SemaTemplate.cpp
+++ lib/Sema/SemaTemplate.cpp
@@ -4597,11 +4597,15 @@
 
     case TemplateArgument::Expression: {
       TemplateArgument Result;
+      unsigned CurSFINAEErrors = NumSFINAEErrors;
       ExprResult Res =
         CheckTemplateArgument(NTTP, NTTPType, Arg.getArgument().getAsExpr(),
                               Result, CTAK);
       if (Res.isInvalid())
         return true;
+      // If the current template argument causes an error, give up now.
+      if (CurSFINAEErrors < NumSFINAEErrors)
+        return true;
 
       // If the resulting expression is new, then use it in place of the
       // old expression in the template argument.
Index: test/SemaTemplate/temp_arg_nontype_cxx11.cpp
===================================================================
--- test/SemaTemplate/temp_arg_nontype_cxx11.cpp
+++ test/SemaTemplate/temp_arg_nontype_cxx11.cpp
@@ -36,3 +36,15 @@
   struct Y { constexpr operator int() const { return 0; } };
   template<Y &y> struct A<y> {}; // expected-error {{cannot be deduced}} expected-note {{'y'}}
 }
+
+namespace ReportCorrectParam {
+template <int a, unsigned b, int c>
+void TempFunc() {}
+
+void Useage() {
+  //expected-error at +2 {{no matching function}}
+  //expected-note at -4 {{candidate template ignored: invalid explicitly-specified argument for template parameter 'b'}}
+  TempFunc<1, -1, 1>();
+}
+}
+


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42664.131882.patch
Type: text/x-patch
Size: 1486 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180129/8584b2b6/attachment.bin>


More information about the cfe-commits mailing list