Skip to content

Commit

Permalink
"Reapply "[Sema] Fix crash on invalid code with parenthesized aggrega… (
Browse files Browse the repository at this point in the history
llvm#76833)

…te initialization" (llvm#76272)""

With updates the libc++ tests.

This reverts commit 2205d23 and relands
86dc6e1 and
7ab16fb.

Original commit was reverted because of failing libc++ tests, see llvm#76232
for the discussion.

The errors in the tests are spurious in the first place (coming from
initialization of invalid classes), so update the tests to match new
behavior that does not show those errors.

The original patch was written by @ilya-biryukov 

To fix the CI two libc++ tests are temporary disabled for clang-18.
  • Loading branch information
mordante committed Jan 5, 2024
1 parent 848d7af commit 02a33b7
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 1 deletion.
8 changes: 8 additions & 0 deletions clang/lib/Sema/SemaInit.cpp
Expand Up @@ -5512,6 +5512,14 @@ static void TryOrBuildParenListInitialization(
} else if (auto *RT = Entity.getType()->getAs<RecordType>()) {
bool IsUnion = RT->isUnionType();
const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
if (RD->isInvalidDecl()) {
// Exit early to avoid confusion when processing members.
// We do the same for braced list initialization in
// `CheckStructUnionTypes`.
Sequence.SetFailed(
clang::InitializationSequence::FK_ParenthesizedListInitFailed);
return;
}

if (!IsUnion) {
for (const CXXBaseSpecifier &Base : RD->bases()) {
Expand Down
28 changes: 28 additions & 0 deletions clang/test/SemaCXX/crash-GH76228.cpp
@@ -0,0 +1,28 @@
// RUN: %clang_cc1 -std=c++20 -verify %s
// Check we don't crash on incomplete members and bases when handling parenthesized initialization.
class incomplete; // expected-note@-0 3 {{forward declaration of 'incomplete'}}
struct foo {
int a;
incomplete b;
// expected-error@-1 {{incomplete type}}
};
foo a1(0);

struct one_int {
int a;
};
struct bar : one_int, incomplete {};
// expected-error@-1 {{incomplete type}}
bar a2(0);

incomplete a3[3](1,2,3);
// expected-error@-1 {{incomplete type}}

struct qux : foo {
};
qux a4(0);

struct fred {
foo a[3];
};
fred a5(0);
2 changes: 1 addition & 1 deletion clang/test/SemaCXX/paren-list-agg-init.cpp
Expand Up @@ -289,7 +289,7 @@ int test() {
// used to crash
S a(0, 1);
S b(0);
S c(0, 0, 1); // beforecxx20-warning {{aggregate initialization of type 'S' from a parenthesized list of values is a C++20 extension}}
S c(0, 0, 1);

S d {0, 1};
S e {0};
Expand Down
Expand Up @@ -6,6 +6,15 @@
//
//===----------------------------------------------------------------------===//

// https://github.com/llvm/llvm-project/pull/76232 breaks this libc++ test.
// The fix would be to update this file. The issue is that the CI uses 2
// versions of Clang-18
// - An older nightly build as the main compiler
// - A freshly bootstrap build
// This means the test can't be used until the nightly build is updated.
// TODO(mordante) Reenable clang-18.
// UNSUPPORTED: clang-18

// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20

// Test the mandates
Expand Down
Expand Up @@ -6,6 +6,15 @@
//
//===----------------------------------------------------------------------===//

// https://github.com/llvm/llvm-project/pull/76232 breaks this libc++ test.
// The fix would be to update this file. The issue is that the CI uses 2
// versions of Clang-18
// - An older nightly build as the main compiler
// - A freshly bootstrap build
// This means the test can't be used until the nightly build is updated.
// TODO(mordante) Reenable clang-18.
// UNSUPPORTED: clang-18

// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20

// Test the mandates
Expand Down

0 comments on commit 02a33b7

Please sign in to comment.