https://github.com/hazohelet updated https://github.com/llvm/llvm-project/pull/67817
>From e331f12dd6f8976df44855619ab740aee86ddd2e Mon Sep 17 00:00:00 2001 From: Takuya Shimizu <shimizu2...@gmail.com> Date: Fri, 29 Sep 2023 23:49:11 +0900 Subject: [PATCH 1/2] [clang][ExprConst] Fix crash on uninitialized array subobject https://reviews.llvm.org/D146358 was assuming that all subobjects have their own name (`SubobjectDecl`), but it was not true for array elements. Fixes https://github.com/llvm/llvm-project/issues/67317 --- clang/include/clang/Basic/DiagnosticASTKinds.td | 2 +- clang/lib/AST/ExprConstant.cpp | 13 +++++++++---- clang/lib/AST/Interp/Interp.cpp | 2 +- clang/test/SemaCXX/eval-crashes.cpp | 7 +++++++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticASTKinds.td b/clang/include/clang/Basic/DiagnosticASTKinds.td index d2656310e79c9b8..71dabac2d32402a 100644 --- a/clang/include/clang/Basic/DiagnosticASTKinds.td +++ b/clang/include/clang/Basic/DiagnosticASTKinds.td @@ -69,7 +69,7 @@ def note_consteval_address_accessible : Note< "%select{pointer|reference}0 to a consteval declaration " "is not a constant expression">; def note_constexpr_uninitialized : Note< - "subobject %0 is not initialized">; + "subobject %select{of type |}0%1 is not initialized">; def note_constexpr_uninitialized_base : Note< "constructor of base class %0 is not called">; def note_constexpr_static_local : Note< diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index f0d53d6ae18e804..acf4b33242c4a27 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -2411,10 +2411,15 @@ static bool CheckEvaluationResult(CheckEvaluationResultKind CERK, const FieldDecl *SubobjectDecl, CheckedTemporaries &CheckedTemps) { if (!Value.hasValue()) { - assert(SubobjectDecl && "SubobjectDecl shall be non-null"); - Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized) << SubobjectDecl; - Info.Note(SubobjectDecl->getLocation(), - diag::note_constexpr_subobject_declared_here); + if (SubobjectDecl) { + Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized) + << true << SubobjectDecl; + Info.Note(SubobjectDecl->getLocation(), + diag::note_constexpr_subobject_declared_here); + } else { + // FIXME: We should add a test to check the output of this case. + Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized) << false << Type; + } return false; } diff --git a/clang/lib/AST/Interp/Interp.cpp b/clang/lib/AST/Interp/Interp.cpp index e1951574edb6288..0e7e9bac1c8079a 100644 --- a/clang/lib/AST/Interp/Interp.cpp +++ b/clang/lib/AST/Interp/Interp.cpp @@ -404,7 +404,7 @@ bool CheckPure(InterpState &S, CodePtr OpPC, const CXXMethodDecl *MD) { static void DiagnoseUninitializedSubobject(InterpState &S, const SourceInfo &SI, const FieldDecl *SubObjDecl) { assert(SubObjDecl && "Subobject declaration does not exist"); - S.FFDiag(SI, diag::note_constexpr_uninitialized) << SubObjDecl; + S.FFDiag(SI, diag::note_constexpr_uninitialized) << true << SubObjDecl; S.Note(SubObjDecl->getLocation(), diag::note_constexpr_subobject_declared_here); } diff --git a/clang/test/SemaCXX/eval-crashes.cpp b/clang/test/SemaCXX/eval-crashes.cpp index 3e59ad31c559da8..ac04b113f99b7aa 100644 --- a/clang/test/SemaCXX/eval-crashes.cpp +++ b/clang/test/SemaCXX/eval-crashes.cpp @@ -54,3 +54,10 @@ namespace pr33140_10 { int a(const int &n = 0); bool b() { return a() == a(); } } + +namespace GH67317 { +struct array { + int (&data)[2]; + array() : data(*new int[1][2]) {} +}; +} >From fb69c5ab54087f86111c7eb7600a4d8015f7d092 Mon Sep 17 00:00:00 2001 From: Takuya Shimizu <shimizu2...@gmail.com> Date: Sat, 30 Sep 2023 00:03:29 +0900 Subject: [PATCH 2/2] Add release note --- clang/docs/ReleaseNotes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 09302040a3510b6..195896ae089ba7f 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -269,6 +269,8 @@ Bug Fixes in This Version - Fixes crash when trying to obtain the common sugared type of `decltype(instantiation-dependent-expr)`. Fixes (`#67603 <https://github.com/llvm/llvm-project/issues/67603>`_) +- Fix crash from constexpr evaluator evaluating uninitialized arrays as rvalue. + Fixes (`#67317 <https://github.com/llvm/llvm-project/issues/67317>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits