[clang] d70f54f - [clang][bytecode] Fix reporting failed local constexpr initializers (#123588)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 20 04:25:53 PST 2025
Author: Timm Baeder
Date: 2025-01-20T13:25:50+01:00
New Revision: d70f54f248853f4d5f9e71a51dfda53a47f0b7d3
URL: https://github.com/llvm/llvm-project/commit/d70f54f248853f4d5f9e71a51dfda53a47f0b7d3
DIFF: https://github.com/llvm/llvm-project/commit/d70f54f248853f4d5f9e71a51dfda53a47f0b7d3.diff
LOG: [clang][bytecode] Fix reporting failed local constexpr initializers (#123588)
We need to emit the 'initializer of X is not a constant expression' note
for local constexpr variables as well.
Added:
Modified:
clang/lib/AST/ByteCode/Interp.cpp
clang/test/AST/ByteCode/c23.c
clang/test/AST/ByteCode/literals.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index 4b26cc66cd09ad..c765ebf5d618ee 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -416,9 +416,11 @@ bool CheckRange(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
AccessKinds AK) {
if (!Ptr.isOnePastEnd())
return true;
- const SourceInfo &Loc = S.Current->getSource(OpPC);
- S.FFDiag(Loc, diag::note_constexpr_access_past_end)
- << AK << S.Current->getRange(OpPC);
+ if (S.getLangOpts().CPlusPlus) {
+ const SourceInfo &Loc = S.Current->getSource(OpPC);
+ S.FFDiag(Loc, diag::note_constexpr_access_past_end)
+ << AK << S.Current->getRange(OpPC);
+ }
return false;
}
@@ -538,7 +540,7 @@ bool CheckInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
return true;
if (const auto *VD = Ptr.getDeclDesc()->asVarDecl();
- VD && VD->hasGlobalStorage()) {
+ VD && (VD->isConstexpr() || VD->hasGlobalStorage())) {
const SourceInfo &Loc = S.Current->getSource(OpPC);
if (VD->getAnyInitializer()) {
S.FFDiag(Loc, diag::note_constexpr_var_init_non_constant, 1) << VD;
diff --git a/clang/test/AST/ByteCode/c23.c b/clang/test/AST/ByteCode/c23.c
index 5154d57f6cb9e7..0e9851aa2ad3a5 100644
--- a/clang/test/AST/ByteCode/c23.c
+++ b/clang/test/AST/ByteCode/c23.c
@@ -49,3 +49,11 @@ static_assert(arg1[1] == 254);
static_assert(arg1[2] == 186);
static_assert(arg1[3] == 190);
#endif
+
+void ghissue109095() {
+ constexpr char c[] = { 'a' };
+ constexpr int i = c[1]; // both-error {{constexpr variable 'i' must be initialized by a constant expression}}\
+ // both-note {{declared here}}
+ _Static_assert(i == c[0]); // both-error {{static assertion expression is not an integral constant expression}}\
+ // both-note {{initializer of 'i' is not a constant expression}}
+}
diff --git a/clang/test/AST/ByteCode/literals.cpp b/clang/test/AST/ByteCode/literals.cpp
index fdf1a6820e4466..b75ca2b19a969a 100644
--- a/clang/test/AST/ByteCode/literals.cpp
+++ b/clang/test/AST/ByteCode/literals.cpp
@@ -1315,3 +1315,12 @@ namespace {
}
}
#endif
+
+void localConstexpr() {
+ constexpr int a = 1/0; // both-error {{must be initialized by a constant expression}} \
+ // both-note {{division by zero}} \
+ // both-warning {{division by zero is undefined}} \
+ // both-note {{declared here}}
+ static_assert(a == 0, ""); // both-error {{not an integral constant expression}} \
+ // both-note {{initializer of 'a' is not a constant expression}}
+}
More information about the cfe-commits
mailing list