Author: Timm Baeder Date: 2025-04-25T08:54:34+02:00 New Revision: 5eca2ddeba6d05f0b1cf2193d56d059502122d00
URL: https://github.com/llvm/llvm-project/commit/5eca2ddeba6d05f0b1cf2193d56d059502122d00 DIFF: https://github.com/llvm/llvm-project/commit/5eca2ddeba6d05f0b1cf2193d56d059502122d00.diff LOG: [clang][bytecode] Don't diagnose const extern reads in CPCE mode (#137285) They might become constexpr later. Added: Modified: clang/lib/AST/ByteCode/Descriptor.cpp clang/lib/AST/ByteCode/Descriptor.h clang/lib/AST/ByteCode/Interp.cpp clang/lib/AST/ByteCode/Program.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/Descriptor.cpp b/clang/lib/AST/ByteCode/Descriptor.cpp index 6bc51596f441f..fc389e1c18c66 100644 --- a/clang/lib/AST/ByteCode/Descriptor.cpp +++ b/clang/lib/AST/ByteCode/Descriptor.cpp @@ -358,13 +358,13 @@ Descriptor::Descriptor(const DeclTy &D, PrimType Type, MetadataSize MD, /// Primitive unknown-size arrays. Descriptor::Descriptor(const DeclTy &D, PrimType Type, MetadataSize MD, - bool IsTemporary, UnknownSize) + bool IsTemporary, bool IsConst, UnknownSize) : Source(D), ElemSize(primSize(Type)), Size(UnknownSizeMark), MDSize(MD.value_or(0)), - AllocSize(MDSize + sizeof(InitMapPtr) + alignof(void *)), IsConst(true), - IsMutable(false), IsTemporary(IsTemporary), IsArray(true), - CtorFn(getCtorArrayPrim(Type)), DtorFn(getDtorArrayPrim(Type)), - MoveFn(getMoveArrayPrim(Type)) { + AllocSize(MDSize + sizeof(InitMapPtr) + alignof(void *)), + IsConst(IsConst), IsMutable(false), IsTemporary(IsTemporary), + IsArray(true), CtorFn(getCtorArrayPrim(Type)), + DtorFn(getDtorArrayPrim(Type)), MoveFn(getMoveArrayPrim(Type)) { assert(Source && "Missing source"); } diff --git a/clang/lib/AST/ByteCode/Descriptor.h b/clang/lib/AST/ByteCode/Descriptor.h index 532b407c2c788..251443475efc8 100644 --- a/clang/lib/AST/ByteCode/Descriptor.h +++ b/clang/lib/AST/ByteCode/Descriptor.h @@ -184,7 +184,7 @@ struct Descriptor final { bool IsConst, bool IsTemporary, bool IsMutable); /// Allocates a descriptor for an array of primitives of unknown size. - Descriptor(const DeclTy &D, PrimType Type, MetadataSize MDSize, + Descriptor(const DeclTy &D, PrimType Type, MetadataSize MDSize, bool IsConst, bool IsTemporary, UnknownSize); /// Allocates a descriptor for an array of composites. diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index 23fd894bd6a3e..9d7cea0de0182 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -396,10 +396,12 @@ bool CheckExtern(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { (Ptr.getDeclDesc()->asVarDecl() == S.EvaluatingDecl)) return true; - if (!S.checkingPotentialConstantExpression() && S.getLangOpts().CPlusPlus) { - const auto *VD = Ptr.getDeclDesc()->asValueDecl(); - diagnoseNonConstVariable(S, OpPC, VD); - } + if (S.checkingPotentialConstantExpression() && S.getLangOpts().CPlusPlus && + Ptr.isConst()) + return false; + + const auto *VD = Ptr.getDeclDesc()->asValueDecl(); + diagnoseNonConstVariable(S, OpPC, VD); return false; } @@ -740,12 +742,12 @@ bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) { if (!CheckLive(S, OpPC, Ptr, AK)) return false; + if (!CheckExtern(S, OpPC, Ptr)) + return false; if (!CheckConstant(S, OpPC, Ptr)) return false; if (!CheckDummy(S, OpPC, Ptr, AK)) return false; - if (!CheckExtern(S, OpPC, Ptr)) - return false; if (!CheckRange(S, OpPC, Ptr, AK)) return false; if (!CheckActive(S, OpPC, Ptr, AK)) diff --git a/clang/lib/AST/ByteCode/Program.cpp b/clang/lib/AST/ByteCode/Program.cpp index fdb7b960ff06d..2d9ed58effe16 100644 --- a/clang/lib/AST/ByteCode/Program.cpp +++ b/clang/lib/AST/ByteCode/Program.cpp @@ -166,11 +166,11 @@ unsigned Program::getOrCreateDummy(const DeclTy &D) { Descriptor *Desc; if (std::optional<PrimType> T = Ctx.classify(QT)) - Desc = createDescriptor(D, *T, nullptr, std::nullopt, /*IsTemporary=*/true, - /*IsMutable=*/false); + Desc = createDescriptor(D, *T, /*SourceTy=*/nullptr, std::nullopt, + /*IsConst=*/QT.isConstQualified()); else Desc = createDescriptor(D, QT.getTypePtr(), std::nullopt, - /*IsTemporary=*/true, /*IsMutable=*/false); + /*IsConst=*/QT.isConstQualified()); if (!Desc) Desc = allocateDescriptor(D); @@ -431,7 +431,7 @@ Descriptor *Program::createDescriptor(const DeclTy &D, const Type *Ty, if (isa<IncompleteArrayType>(ArrayType) || isa<VariableArrayType>(ArrayType)) { if (std::optional<PrimType> T = Ctx.classify(ElemTy)) { - return allocateDescriptor(D, *T, MDSize, IsTemporary, + return allocateDescriptor(D, *T, MDSize, IsConst, IsTemporary, Descriptor::UnknownSize{}); } else { const Descriptor *Desc = createDescriptor( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits