Author: erichkeane Date: Mon May 7 10:05:20 2018 New Revision: 331651 URL: http://llvm.org/viewvc/llvm-project?rev=331651&view=rev Log: Fix explicit template parameter reporting for narrowing conversions
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. Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=331651&r1=331650&r2=331651&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Mon May 7 10:05:20 2018 @@ -4668,11 +4668,15 @@ bool Sema::CheckTemplateArgument(NamedDe 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. Modified: cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp?rev=331651&r1=331650&r2=331651&view=diff ============================================================================== --- cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp (original) +++ cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Mon May 7 10:05:20 2018 @@ -36,3 +36,15 @@ namespace check_conversion_early { 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@+2 {{no matching function}} + //expected-note@-4 {{candidate template ignored: invalid explicitly-specified argument for template parameter 'b'}} + TempFunc<1, -1, 1>(); +} +} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits