[clang] 66202d8 - Make 'static assertion failed' diagnostics point to the static assertion expression
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 13 05:15:26 PDT 2023
Author: Jorge Pinto Sousa
Date: 2023-04-13T08:15:13-04:00
New Revision: 66202d83b5d47479ae0f8117aebb523ba7eff82d
URL: https://github.com/llvm/llvm-project/commit/66202d83b5d47479ae0f8117aebb523ba7eff82d
DIFF: https://github.com/llvm/llvm-project/commit/66202d83b5d47479ae0f8117aebb523ba7eff82d.diff
LOG: Make 'static assertion failed' diagnostics point to the static assertion expression
"static assertion failed" pointed to the static_assert token and
then underlined the static assertion expression:
<source>:3:1: error: static assertion failed
static_assert(false);
^ ~~~~~
1 error generated.
See Godbolt: https://godbolt.org/z/r38booz59
Now it points to and highlights the assertion expression.
Fixes https://github.com/llvm/llvm-project/issues/61951
Differential Revision: https://reviews.llvm.org/D147745
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaDeclCXX.cpp
clang/test/SemaCXX/static-assert.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index e08aecfcc881..9abfaf5b2322 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -218,6 +218,9 @@ Improvements to Clang's diagnostics
- Clang now avoids unnecessary diagnostic warnings for obvious expressions in
the case of binary operators with logical OR operations.
(`#57906 <https://github.com/llvm/llvm-project/issues/57906>`_)
+- Clang's "static assertion failed" diagnostic now points to the static assertion
+ expression instead of pointing to the ``static_assert`` token.
+ (`#61951 <https://github.com/llvm/llvm-project/issues/61951>`_)
Bug Fixes in This Version
-------------------------
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 524f0a999907..7fd12319e4d6 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -16820,19 +16820,20 @@ Decl *Sema::BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc,
if (InnerCond && isa<ConceptSpecializationExpr>(InnerCond)) {
// Drill down into concept specialization expressions to see why they
// weren't satisfied.
- Diag(StaticAssertLoc, diag::err_static_assert_failed)
- << !AssertMessage << Msg.str() << AssertExpr->getSourceRange();
+ Diag(AssertExpr->getBeginLoc(), diag::err_static_assert_failed)
+ << !AssertMessage << Msg.str() << AssertExpr->getSourceRange();
ConstraintSatisfaction Satisfaction;
if (!CheckConstraintSatisfaction(InnerCond, Satisfaction))
DiagnoseUnsatisfiedConstraint(Satisfaction);
} else if (InnerCond && !isa<CXXBoolLiteralExpr>(InnerCond)
&& !isa<IntegerLiteral>(InnerCond)) {
- Diag(StaticAssertLoc, diag::err_static_assert_requirement_failed)
- << InnerCondDescription << !AssertMessage
- << Msg.str() << InnerCond->getSourceRange();
+ Diag(InnerCond->getBeginLoc(),
+ diag::err_static_assert_requirement_failed)
+ << InnerCondDescription << !AssertMessage << Msg.str()
+ << InnerCond->getSourceRange();
DiagnoseStaticAssertDetails(InnerCond);
} else {
- Diag(StaticAssertLoc, diag::err_static_assert_failed)
+ Diag(AssertExpr->getBeginLoc(), diag::err_static_assert_failed)
<< !AssertMessage << Msg.str() << AssertExpr->getSourceRange();
PrintContextStack();
}
diff --git a/clang/test/SemaCXX/static-assert.cpp b/clang/test/SemaCXX/static-assert.cpp
index ea8037815a20..83fc4bd25628 100644
--- a/clang/test/SemaCXX/static-assert.cpp
+++ b/clang/test/SemaCXX/static-assert.cpp
@@ -287,5 +287,28 @@ namespace Diagnostics {
static_assert(CHECK_4(a) && A_IS_B, ""); // expected-error {{failed}} \
// expected-note {{evaluates to '4 == 5'}}
+ static_assert(
+ false, // expected-error {{static assertion failed}}
+ ""
+ );
+
+ static_assert(
+ true && false, // expected-error {{static assertion failed due to requirement 'true && false'}}
+ ""
+ );
+
+ static_assert(
+ // with a comment here
+ true && false, // expected-error {{static assertion failed due to requirement 'true && false'}}
+ ""
+ );
+
+ static_assert(
+ // with a comment here
+ (true && // expected-error {{static assertion failed due to requirement '(true && false) || false'}}
+ false)
+ || false,
+ ""
+ );
}
More information about the cfe-commits
mailing list