Author: Timm Bäder Date: 2024-06-29T21:10:25+02:00 New Revision: 5a8c4b597beed38e392f221042d29f475a3d1626
URL: https://github.com/llvm/llvm-project/commit/5a8c4b597beed38e392f221042d29f475a3d1626 DIFF: https://github.com/llvm/llvm-project/commit/5a8c4b597beed38e392f221042d29f475a3d1626.diff LOG: [clang][Interp] Don't allow reading from non-const blocks when returning Added: Modified: clang/lib/AST/Interp/EvalEmitter.cpp clang/test/AST/Interp/const-temporaries.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/EvalEmitter.cpp b/clang/lib/AST/Interp/EvalEmitter.cpp index f4854adba9348..d17151416b44b 100644 --- a/clang/lib/AST/Interp/EvalEmitter.cpp +++ b/clang/lib/AST/Interp/EvalEmitter.cpp @@ -151,6 +151,11 @@ template <> bool EvalEmitter::emitRet<PT_Ptr>(const SourceInfo &Info) { // Implicitly convert lvalue to rvalue, if requested. if (ConvertResultToRValue) { + // 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()) + return false; + if (std::optional<APValue> V = Ptr.toRValue(Ctx)) { EvalResult.setValue(*V); } else { diff --git a/clang/test/AST/Interp/const-temporaries.cpp b/clang/test/AST/Interp/const-temporaries.cpp index bbb95b3c3dff7..1dc16ef63a846 100644 --- a/clang/test/AST/Interp/const-temporaries.cpp +++ b/clang/test/AST/Interp/const-temporaries.cpp @@ -90,3 +90,12 @@ struct R { mutable long x; }; struct Z2 { const R &x, y; }; Z2 z2 = { R{1}, z2.x.x = 10 }; +// CHECK: __cxa_atexit({{.*}} @_ZN1BD1Ev, {{.*}} @b + +// CHECK: define +// CHECK-NOT: @_ZGRN21ModifyStaticTemporary1cE_ +// CHECK: store {{.*}} @_ZGRN21ModifyStaticTemporary1cE_, {{.*}} @_ZN21ModifyStaticTemporary1cE +// CHECK: add +// CHECK: store +// CHECK: load {{.*}} @_ZN21ModifyStaticTemporary1bE +// CHECK: store {{.*}} @_ZN21ModifyStaticTemporary1cE _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits