From: James Y Knight Date: Fri, 5 Oct 2018 17:49:48 +0000 (+0000) Subject: Emit diagnostic note when calling an invalid function declaration. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3f6d5060de9d76c441d4104cb11fe380e99887f8;p=clang Emit diagnostic note when calling an invalid function declaration. The comment said it was intentionally not emitting any diagnostic because the declaration itself was already diagnosed. However, everywhere else that wants to not emit a diagnostic without an extra note emits note_invalid_subexpr_in_const_expr instead, which gets suppressed later. This was the only place which did not emit a diagnostic note. Differential Revision: https://reviews.llvm.org/D52919 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@343867 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index c012fc377f..8a2cbdc187 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -4330,10 +4330,13 @@ static bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc, Declaration->isConstexpr()) return false; - // Bail out with no diagnostic if the function declaration itself is invalid. - // We will have produced a relevant diagnostic while parsing it. - if (Declaration->isInvalidDecl()) + // Bail out if the function declaration itself is invalid. We will + // have produced a relevant diagnostic while parsing it, so just + // note the problematic sub-expression. + if (Declaration->isInvalidDecl()) { + Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr); return false; + } // Can we evaluate this function call? if (Definition && Definition->isConstexpr() && diff --git a/test/SemaCXX/enable_if.cpp b/test/SemaCXX/enable_if.cpp index 93014f50d5..ba520b047a 100644 --- a/test/SemaCXX/enable_if.cpp +++ b/test/SemaCXX/enable_if.cpp @@ -414,7 +414,8 @@ static_assert(templated<1>() == 1, ""); template constexpr int callTemplated() { return templated(); } -constexpr int B = callTemplated<0>(); // expected-error{{initialized by a constant expression}} expected-error@-2{{no matching function for call to 'templated'}} expected-note{{in instantiation of function template}} expected-note@-9{{candidate disabled}} +constexpr int B = 10 + // the carat for the error should be pointing to the problematic call (on the next line), not here. + callTemplated<0>(); // expected-error{{initialized by a constant expression}} expected-error@-3{{no matching function for call to 'templated'}} expected-note{{in instantiation of function template}} expected-note@-10{{candidate disabled}} static_assert(callTemplated<1>() == 1, ""); }