[PATCH] D154486: [Clang] Fix a crash when trying to initialize an invalid aggregate.
Corentin Jabot via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 5 02:34:49 PDT 2023
cor3ntin created this revision.
Herald added a project: All.
cor3ntin requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
We did not return an error when failing to producing
a valid expression when performing the initialization of
an aggregate initialized with a parenthesized list of expressions.
This is a regression introduced in Clang 17.
Fixes #63278
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D154486
Files:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaInit.cpp
clang/test/SemaCXX/paren-list-agg-init.cpp
Index: clang/test/SemaCXX/paren-list-agg-init.cpp
===================================================================
--- clang/test/SemaCXX/paren-list-agg-init.cpp
+++ clang/test/SemaCXX/paren-list-agg-init.cpp
@@ -272,3 +272,24 @@
// expected-warning at -1 {{braces around scalar init}}
// beforecxx20-warning at -2 {{aggregate initialization of type 'A' from a parenthesized list of values is a C++20 extension}}
}
+
+
+namespace GH63278 {
+struct S {
+ int a = 0;
+ int b {0};
+ auto x = 1; // expected-error {{'auto' not allowed in non-static struct member}}
+};
+
+int test() {
+ // used to crash
+ S a(0, 1);
+ S b(0);
+ S c(0, 0, 1);
+
+ S d {0, 1};
+ S e {0};
+ S f {0, 0, 1};
+}
+
+}
Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -9387,10 +9387,13 @@
}
}
+ auto *Init = CurInit.get();
+ if (!Init)
+ return ExprError();
+
// Check whether the initializer has a shorter lifetime than the initialized
// entity, and if not, either lifetime-extend or warn as appropriate.
- if (auto *Init = CurInit.get())
- S.checkInitializerLifetime(Entity, Init);
+ S.checkInitializerLifetime(Entity, Init);
// Diagnose non-fatal problems with the completed initialization.
if (InitializedEntity::EntityKind EK = Entity.getKind();
@@ -9398,16 +9401,13 @@
EK == InitializedEntity::EK_ParenAggInitMember) &&
cast<FieldDecl>(Entity.getDecl())->isBitField())
S.CheckBitFieldInitialization(Kind.getLocation(),
- cast<FieldDecl>(Entity.getDecl()),
- CurInit.get());
+ cast<FieldDecl>(Entity.getDecl()), Init);
// Check for std::move on construction.
- if (const Expr *E = CurInit.get()) {
- CheckMoveOnConstruction(S, E,
- Entity.getKind() == InitializedEntity::EK_Result);
- }
+ CheckMoveOnConstruction(S, Init,
+ Entity.getKind() == InitializedEntity::EK_Result);
- return CurInit;
+ return Init;
}
/// Somewhere within T there is an uninitialized reference subobject.
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -630,6 +630,8 @@
- Allow abstract parameter and return types in functions that are
either deleted or not defined.
(`#63012 <https://github.com/llvm/llvm-project/issues/63012>`_)
+- Fix a crash when trying to parentheses-initialize an invalid aggregate.
+ (`#63278 <https://github.com/llvm/llvm-project/issues/63278>`_)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D154486.537269.patch
Type: text/x-patch
Size: 2766 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230705/8ce1f314/attachment.bin>
More information about the cfe-commits
mailing list