"Reapply "[Sema] Fix crash on invalid code with parenthesized aggrega… (#76833)

…te initialization" (#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 #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.
This commit is contained in:
Mark de Wever 2024-01-05 19:43:10 +01:00 committed by GitHub
parent 848d7af956
commit 02a33b72fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 1 deletions

View File

@ -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()) {

View File

@ -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);

View File

@ -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};

View File

@ -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

View File

@ -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