[clang][Interp] Only lazily visit constant globals

Differential Revision: https://reviews.llvm.org/D158516
This commit is contained in:
Timm Bäder 2023-08-22 16:48:01 +02:00
parent 5c4d35d8cf
commit 4d7f4a7c82
2 changed files with 9 additions and 4 deletions

View File

@ -2536,7 +2536,8 @@ bool ByteCodeExprGen<Emitter>::VisitDeclRefExpr(const DeclRefExpr *E) {
// This happens in C.
if (!Ctx.getLangOpts().CPlusPlus) {
if (const auto *VD = dyn_cast<VarDecl>(D);
VD && VD->hasGlobalStorage() && VD->getAnyInitializer()) {
VD && VD->hasGlobalStorage() && VD->getAnyInitializer() &&
VD->getType().isConstQualified()) {
if (!this->visitVarDecl(VD))
return false;
// Retry.

View File

@ -14,11 +14,15 @@ _Static_assert(!!1.0, ""); // pedantic-ref-warning {{not an integer constant exp
// pedantic-expected-warning {{not an integer constant expression}}
_Static_assert(!!1, "");
/// FIXME: Should also be rejected in the new interpreter
int a = (1 == 1 ? 5 : 3);
int a = (1 == 1 ? 5 : 3); // expected-note {{declared here}} \
// pedantic-expected-note {{declared here}}
_Static_assert(a == 5, ""); // ref-error {{not an integral constant expression}} \
// pedantic-ref-error {{not an integral constant expression}} \
// pedantic-expected-warning {{not an integer constant expression}}
// expected-error {{not an integral constant expression}} \
// expected-note {{read of non-const variable}} \
// pedantic-expected-error {{not an integral constant expression}} \
// pedantic-expected-note {{read of non-const variable}}
const int b = 3;
_Static_assert(b == 3, ""); // pedantic-ref-warning {{not an integer constant expression}} \