Author: Timm Bäder Date: 2024-07-20T10:01:25+02:00 New Revision: 0d26f65414afe496b00ee803cc24722a9bf3f41d
URL: https://github.com/llvm/llvm-project/commit/0d26f65414afe496b00ee803cc24722a9bf3f41d DIFF: https://github.com/llvm/llvm-project/commit/0d26f65414afe496b00ee803cc24722a9bf3f41d.diff LOG: [clang][Interp] Emit diagnostics if final ltor conversion fails Added: Modified: clang/lib/AST/Interp/EvalEmitter.cpp clang/test/AST/Interp/cxx11.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/EvalEmitter.cpp b/clang/lib/AST/Interp/EvalEmitter.cpp index 59e78686b78ad..221bbfdc542ff 100644 --- a/clang/lib/AST/Interp/EvalEmitter.cpp +++ b/clang/lib/AST/Interp/EvalEmitter.cpp @@ -169,7 +169,9 @@ template <> bool EvalEmitter::emitRet<PT_Ptr>(const SourceInfo &Info) { return false; // Never allow reading from a non-const pointer, unless the memory // has been created in this evaluation. - if (!Ptr.isConst() && Ptr.block()->getEvalID() != Ctx.getEvalID()) + if (!Ptr.isZero() && Ptr.isBlockPointer() && + Ptr.block()->getEvalID() != Ctx.getEvalID() && + (!CheckLoad(S, OpPC, Ptr, AK_Read) || !Ptr.isConst())) return false; if (std::optional<APValue> V = diff --git a/clang/test/AST/Interp/cxx11.cpp b/clang/test/AST/Interp/cxx11.cpp index 92ab9b605f30d..cf2dfba079ef7 100644 --- a/clang/test/AST/Interp/cxx11.cpp +++ b/clang/test/AST/Interp/cxx11.cpp @@ -152,3 +152,11 @@ void A::f(SortOrder order) { return; } } + +namespace FinalLtorDiags { + template<int*> struct A {}; // both-note {{template parameter is declared here}} + int k; + int *q = &k; // both-note {{declared here}} + A<q> c; // both-error {{non-type template argument of type 'int *' is not a constant expression}} \ + // both-note {{read of non-constexpr variable 'q' is not allowed in a constant expression}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits