Author: Timm Baeder Date: 2025-01-14T15:10:48+01:00 New Revision: c1de9b920935e7d2fcc8dd7b39c1b7285783e948
URL: https://github.com/llvm/llvm-project/commit/c1de9b920935e7d2fcc8dd7b39c1b7285783e948 DIFF: https://github.com/llvm/llvm-project/commit/c1de9b920935e7d2fcc8dd7b39c1b7285783e948.diff LOG: [clang][bytecode] Mark global decls with diagnostics invalid (#122895) Even if their evaluation succeeds, mark them as invalid. This fixes some long standing differences to the ast walker interpeter. Added: Modified: clang/lib/AST/ByteCode/EvalEmitter.cpp clang/test/AST/ByteCode/arrays.cpp clang/test/AST/ByteCode/cxx23.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/EvalEmitter.cpp b/clang/lib/AST/ByteCode/EvalEmitter.cpp index 9763fe89b73742..f9220e89abbc85 100644 --- a/clang/lib/AST/ByteCode/EvalEmitter.cpp +++ b/clang/lib/AST/ByteCode/EvalEmitter.cpp @@ -71,6 +71,18 @@ EvaluationResult EvalEmitter::interpretDecl(const VarDecl *VD, if (!this->visitDeclAndReturn(VD, S.inConstantContext())) EvalResult.setInvalid(); + // Mark global variables as invalid if any diagnostic was produced. + if (S.hasPriorDiagnostic() && Context::shouldBeGloballyIndexed(VD)) { + if (auto GlobalIndex = P.getGlobal(VD)) { + Block *GlobalBlock = P.getGlobal(*GlobalIndex); + GlobalInlineDescriptor &GD = + *reinterpret_cast<GlobalInlineDescriptor *>(GlobalBlock->rawData()); + GD.InitState = GlobalInitState::InitializerFailed; + if (GlobalBlock->isInitialized()) + GlobalBlock->invokeDtor(); + } + } + S.EvaluatingDecl = nullptr; updateGlobalTemporaries(); return std::move(this->EvalResult); diff --git a/clang/test/AST/ByteCode/arrays.cpp b/clang/test/AST/ByteCode/arrays.cpp index 4097c65f7c6fba..297894659ff199 100644 --- a/clang/test/AST/ByteCode/arrays.cpp +++ b/clang/test/AST/ByteCode/arrays.cpp @@ -402,14 +402,13 @@ namespace NoInitMapLeak { constexpr int a[] = {1,2,3,4/0,5}; // both-error {{must be initialized by a constant expression}} \ // both-note {{division by zero}} \ - // ref-note {{declared here}} - - /// FIXME: This should fail in the new interpreter as well. - constexpr int b = a[0]; // ref-error {{must be initialized by a constant expression}} \ - // ref-note {{is not a constant expression}} \ - // ref-note {{declared here}} - static_assert(b == 1, ""); // ref-error {{not an integral constant expression}} \ - // ref-note {{not a constant expression}} + // both-note {{declared here}} + + constexpr int b = a[0]; // both-error {{must be initialized by a constant expression}} \ + // both-note {{is not a constant expression}} \ + // both-note {{declared here}} + static_assert(b == 1, ""); // both-error {{not an integral constant expression}} \ + // both-note {{not a constant expression}} constexpr int f() { // both-error {{never produces a constant expression}} int a[] = {19,2,3/0,4}; // both-note 2{{division by zero}} \ diff --git a/clang/test/AST/ByteCode/cxx23.cpp b/clang/test/AST/ByteCode/cxx23.cpp index 6a62ac11cde792..5c437c2eef84bf 100644 --- a/clang/test/AST/ByteCode/cxx23.cpp +++ b/clang/test/AST/ByteCode/cxx23.cpp @@ -217,16 +217,13 @@ namespace UndefinedThreeWay { // all-note {{undefined function 'operator<=>' cannot be used in a constant expression}} } -/// FIXME: The new interpreter is missing the "initializer of q is not a constant expression" diagnostics.a -/// That's because the cast from void* to int* is considered fine, but diagnosed. So we don't consider -/// q to be uninitialized. namespace VoidCast { constexpr void* p = nullptr; constexpr int* q = static_cast<int*>(p); // all-error {{must be initialized by a constant expression}} \ // all-note {{cast from 'void *' is not allowed in a constant expression}} \ - // ref-note {{declared here}} - static_assert(q == nullptr); // ref-error {{not an integral constant expression}} \ - // ref-note {{initializer of 'q' is not a constant expression}} + // all-note {{declared here}} + static_assert(q == nullptr); // all-error {{not an integral constant expression}} \ + // all-note {{initializer of 'q' is not a constant expression}} } namespace ExplicitLambdaInstancePointer { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits