Author: Timm Bäder Date: 2023-10-24T12:00:40+02:00 New Revision: 684e4c0085e8d454c04e9813f89033b1c51d24fa
URL: https://github.com/llvm/llvm-project/commit/684e4c0085e8d454c04e9813f89033b1c51d24fa DIFF: https://github.com/llvm/llvm-project/commit/684e4c0085e8d454c04e9813f89033b1c51d24fa.diff LOG: [clang][Interp] Don't explicitly call InterpState destructor() This broke the msan builders because the destructor will be called twice. Should've guessed. Added: Modified: clang/lib/AST/Interp/Context.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/Context.cpp b/clang/lib/AST/Interp/Context.cpp index 3ad63f40b0c72b7..cb96e56fb5e1ad8 100644 --- a/clang/lib/AST/Interp/Context.cpp +++ b/clang/lib/AST/Interp/Context.cpp @@ -158,17 +158,18 @@ const llvm::fltSemantics &Context::getFloatSemantics(QualType T) const { } bool Context::Run(State &Parent, const Function *Func, APValue &Result) { - InterpState State(Parent, *P, Stk, *this); - State.Current = new InterpFrame(State, Func, /*Caller=*/nullptr, {}); - if (Interpret(State, Result)) { - assert(Stk.empty()); - return true; - } - // We explicitly delete our state here, so the Stk.clear() call - // below doesn't violently free values the destructor would - // otherwise access. - State.~InterpState(); + { + InterpState State(Parent, *P, Stk, *this); + State.Current = new InterpFrame(State, Func, /*Caller=*/nullptr, {}); + if (Interpret(State, Result)) { + assert(Stk.empty()); + return true; + } + + // State gets destroyed here, so the Stk.clear() below doesn't accidentally + // remove values the State's destructor might accedd. + } Stk.clear(); return false; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits