[PATCH] D154675: [Clang] Fix crash when emitting diagnostic for out of order designated initializers in C++
Shafik Yaghmour via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Jul 9 15:16:28 PDT 2023
shafik updated this revision to Diff 538456.
shafik added a comment.
- Stopped using `NumBases` when calculating `OldIndex`
- Added bases classes to the test and added more test cases
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D154675/new/
https://reviews.llvm.org/D154675
Files:
clang/lib/Sema/SemaInit.cpp
clang/test/SemaCXX/cxx2a-initializer-aggregates.cpp
Index: clang/test/SemaCXX/cxx2a-initializer-aggregates.cpp
===================================================================
--- clang/test/SemaCXX/cxx2a-initializer-aggregates.cpp
+++ clang/test/SemaCXX/cxx2a-initializer-aggregates.cpp
@@ -63,7 +63,7 @@
.x = 1, // override-note {{previous}}
.x = 1, // override-error {{overrides prior initialization}} override-note {{previous}}
.y = 1, // override-note {{previous}}
- .y = 1, // override-error {{overrides prior initialization}}
+ .y = 1, // override-error {{overrides prior initialization}} // reorder-note {{previous initialization for field 'y' is here}}
.x = 1, // reorder-error {{declaration order}} override-error {{overrides prior initialization}} override-note {{previous}}
.x = 1, // override-error {{overrides prior initialization}}
};
@@ -177,3 +177,43 @@
h({.a = 1});
}
}
+
+namespace GH63605 {
+struct A {
+ unsigned x;
+ unsigned y;
+ unsigned z;
+};
+
+struct B {
+ unsigned a;
+ unsigned b;
+};
+
+struct : public A, public B {
+ unsigned : 2;
+ unsigned a : 6;
+ unsigned : 1;
+ unsigned b : 6;
+ unsigned : 2;
+ unsigned c : 6;
+ unsigned d : 1;
+ unsigned e : 2;
+} data = {
+ {.z=0,
+ // pedantic-note at -1 {{first non-designated initializer is here}}
+ // reorder-note at -2 {{previous initialization for field 'z' is here}}
+ .y=1, // reorder-error {{field 'z' will be initialized after field 'y'}}
+ // reorder-note at -1 {{previous initialization for field 'y' is here}}
+ .x=2}, // reorder-error {{field 'y' will be initialized after field 'x'}}
+ {.b=3, // reorder-note {{previous initialization for field 'b' is here}}
+ .a=4}, // reorder-error {{field 'b' will be initialized after field 'a'}}
+ .e = 1, // reorder-note {{previous initialization for field 'e' is here}}
+ // pedantic-error at -1 {{mixture of designated and non-designated initializers in the same initializer list is a C99 extension}}
+ .d = 1, // reorder-error {{field 'e' will be initialized after field 'd'}}
+ // reorder-note at -1 {{previous initialization for field 'd' is here}}
+ .c = 1, // reorder-error {{field 'd' will be initialized after field 'c'}} // reorder-note {{previous initialization for field 'c' is here}}
+ .b = 1, // reorder-error {{field 'c' will be initialized after field 'b'}} // reorder-note {{previous initialization for field 'b' is here}}
+ .a = 1, // reorder-error {{field 'b' will be initialized after field 'a'}}
+};
+}
Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -2844,7 +2844,7 @@
SemaRef.Diag(DIE->getBeginLoc(), diag::ext_designated_init_reordered)
<< KnownField << PrevField << DIE->getSourceRange();
- unsigned OldIndex = NumBases + PrevField->getFieldIndex();
+ unsigned OldIndex = StructuredIndex - 1;
if (StructuredList && OldIndex <= StructuredList->getNumInits()) {
if (Expr *PrevInit = StructuredList->getInit(OldIndex)) {
SemaRef.Diag(PrevInit->getBeginLoc(),
@@ -2948,8 +2948,12 @@
// If this the first designator, our caller will continue checking
// the rest of this struct/class/union subobject.
if (IsFirstDesignator) {
+ if (Field != RD->field_end() && Field->isUnnamedBitfield())
+ ++Field;
+
if (NextField)
*NextField = Field;
+
StructuredIndex = FieldIndex;
return false;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D154675.538456.patch
Type: text/x-patch
Size: 3538 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230709/b0f30f5e/attachment-0001.bin>
More information about the cfe-commits
mailing list