llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Congcong Cai (HerrCai0907) <details> <summary>Changes</summary> When evaluating variable initialized from compound literal multiple times, it will be converted to evaluting the compound literal itself multiple times, which causes clang crash in assertions. Further evaluating is not rely on this assertion. Fixes: #<!-- -->69065 --- Full diff: https://github.com/llvm/llvm-project/pull/69106.diff 3 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+3) - (modified) clang/lib/AST/ExprConstant.cpp (-1) - (added) clang/test/AST/issue69065.c (+17) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index be7c8bf247f7af5..5578663a90f104a 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -393,6 +393,9 @@ Bug Fixes in This Version operator in C. No longer issuing a confusing diagnostic along the lines of "incompatible operand types ('foo' and 'foo')" with extensions such as matrix types. Fixes (`#69008 <https://github.com/llvm/llvm-project/issues/69008>`_) +- Fix a crash when evaluating comparasion between the field from the same variable + which initialized from compound literals in C. Fixes + (`#69065 <https://github.com/llvm/llvm-project/issues/69065>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index e5539dedec02a4b..9948b516745a30b 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -1912,7 +1912,6 @@ APValue &CallStackFrame::createLocal(APValue::LValueBase Base, const void *Key, assert(Base.getCallIndex() == Index && "lvalue for wrong frame"); unsigned Version = Base.getVersion(); APValue &Result = Temporaries[MapKeyTy(Key, Version)]; - assert(Result.isAbsent() && "local created multiple times"); // If we're creating a local immediately in the operand of a speculative // evaluation, don't register a cleanup to be run outside the speculative diff --git a/clang/test/AST/issue69065.c b/clang/test/AST/issue69065.c new file mode 100644 index 000000000000000..11428932019418d --- /dev/null +++ b/clang/test/AST/issue69065.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -fsyntax-only %s -verify +// expected-no-diagnostics + +struct A { + int i; +}; +struct B { + struct A *a; +}; +const struct B c = {&(struct A){1}}; + +int main(void) { + if ((c.a->i != 1) || (c.a->i)) { + return 1; + } + return 0; +} `````````` </details> https://github.com/llvm/llvm-project/pull/69106 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits