diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -369,6 +369,8 @@ (`#62207 `_) - Fix lambdas and other anonymous function names not respecting ``-fdebug-prefix-map`` (`#62192 `_) +- Fix crash when redefine variant with invalid type as another invalid type. + (`#62447 `_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -2578,6 +2578,9 @@ } else { T = Context.getIncompleteArrayType(T, ASM, Quals); } + } else if (ArraySize->containsErrors()) { + ConstVal = 1U; + T = Context.getConstantArrayType(T, ConstVal, ArraySize, ASM, Quals); } else if (ArraySize->isTypeDependent() || ArraySize->isValueDependent()) { T = Context.getDependentSizedArrayType(T, ArraySize, ASM, Quals, Brackets); } else { diff --git a/clang/test/AST/ast-dump-types-errors-json.cpp b/clang/test/AST/ast-dump-types-errors-json.cpp --- a/clang/test/AST/ast-dump-types-errors-json.cpp +++ b/clang/test/AST/ast-dump-types-errors-json.cpp @@ -24,18 +24,19 @@ // CHECK-NEXT: }, // CHECK-NEXT: "name": "TestContainsErrors", // CHECK-NEXT: "type": { -// CHECK-NEXT: "qualType": "int[sizeof ((undef))]" +// CHECK-NEXT: "qualType": "int[1]" // CHECK-NEXT: }, // CHECK-NEXT: "inner": [ // CHECK-NEXT: { // CHECK-NEXT: "id": "0x{{.*}}", -// CHECK-NEXT: "kind": "DependentSizedArrayType", +// CHECK-NEXT: "kind": "ConstantArrayType", // CHECK-NEXT: "type": { -// CHECK-NEXT: "qualType": "int[sizeof ((undef))]" +// CHECK-NEXT: "qualType": "int[1]" // CHECK-NEXT: }, // CHECK-NEXT: "containsErrors": true, // CHECK-NEXT: "isDependent": true, // CHECK-NEXT: "isInstantiationDependent": true, +// CHECK-NEXT: "size": 1, // CHECK-NEXT: "inner": [ // CHECK-NEXT: { // CHECK-NEXT: "id": "0x{{.*}}", @@ -43,96 +44,6 @@ // CHECK-NEXT: "type": { // CHECK-NEXT: "qualType": "int" // CHECK-NEXT: } -// CHECK-NEXT: }, -// CHECK-NEXT: { -// CHECK-NEXT: "id": "0x{{.*}}", -// CHECK-NEXT: "kind": "UnaryExprOrTypeTraitExpr", -// CHECK-NEXT: "range": { -// CHECK-NEXT: "begin": { -// CHECK-NEXT: "offset": {{[0-9]+}}, -// CHECK-NEXT: "col": 32, -// CHECK-NEXT: "tokLen": 6 -// CHECK-NEXT: }, -// CHECK-NEXT: "end": { -// CHECK-NEXT: "offset": {{[0-9]+}}, -// CHECK-NEXT: "col": 46, -// CHECK-NEXT: "tokLen": 1 -// CHECK-NEXT: } -// CHECK-NEXT: }, -// CHECK-NEXT: "type": { -// CHECK-NEXT: "qualType": "unsigned long" -// CHECK-NEXT: }, -// CHECK-NEXT: "valueCategory": "prvalue", -// CHECK-NEXT: "name": "sizeof", -// CHECK-NEXT: "inner": [ -// CHECK-NEXT: { -// CHECK-NEXT: "id": "0x{{.*}}", -// CHECK-NEXT: "kind": "ParenExpr", -// CHECK-NEXT: "range": { -// CHECK-NEXT: "begin": { -// CHECK-NEXT: "offset": {{[0-9]+}}, -// CHECK-NEXT: "col": 38, -// CHECK-NEXT: "tokLen": 1 -// CHECK-NEXT: }, -// CHECK-NEXT: "end": { -// CHECK-NEXT: "offset": {{[0-9]+}}, -// CHECK-NEXT: "col": 46, -// CHECK-NEXT: "tokLen": 1 -// CHECK-NEXT: } -// CHECK-NEXT: }, -// CHECK-NEXT: "type": { -// CHECK-NEXT: "qualType": "" -// CHECK-NEXT: }, -// CHECK-NEXT: "valueCategory": "lvalue", -// CHECK-NEXT: "inner": [ -// CHECK-NEXT: { -// CHECK-NEXT: "id": "0x{{.*}}", -// CHECK-NEXT: "kind": "RecoveryExpr", -// CHECK-NEXT: "range": { -// CHECK-NEXT: "begin": { -// CHECK-NEXT: "offset": {{[0-9]+}}, -// CHECK-NEXT: "col": 39, -// CHECK-NEXT: "tokLen": 5 -// CHECK-NEXT: }, -// CHECK-NEXT: "end": { -// CHECK-NEXT: "offset": {{[0-9]+}}, -// CHECK-NEXT: "col": 45, -// CHECK-NEXT: "tokLen": 1 -// CHECK-NEXT: } -// CHECK-NEXT: }, -// CHECK-NEXT: "type": { -// CHECK-NEXT: "qualType": "" -// CHECK-NEXT: }, -// CHECK-NEXT: "valueCategory": "lvalue", -// CHECK-NEXT: "inner": [ -// CHECK-NEXT: { -// CHECK-NEXT: "id": "0x{{.*}}", -// CHECK-NEXT: "kind": "UnresolvedLookupExpr", -// CHECK-NEXT: "range": { -// CHECK-NEXT: "begin": { -// CHECK-NEXT: "offset": {{[0-9]+}}, -// CHECK-NEXT: "col": 39, -// CHECK-NEXT: "tokLen": 5 -// CHECK-NEXT: }, -// CHECK-NEXT: "end": { -// CHECK-NEXT: "offset": {{[0-9]+}}, -// CHECK-NEXT: "col": 39, -// CHECK-NEXT: "tokLen": 5 -// CHECK-NEXT: } -// CHECK-NEXT: }, -// CHECK-NEXT: "type": { -// CHECK-NEXT: "qualType": "" -// CHECK-NEXT: }, -// CHECK-NEXT: "valueCategory": "lvalue", -// CHECK-NEXT: "usesADL": true, -// CHECK-NEXT: "name": "undef", -// CHECK-NEXT: "lookups": [] -// CHECK-NEXT: } -// CHECK-NEXT: ] -// CHECK-NEXT: } -// CHECK-NEXT: ] -// CHECK-NEXT: } -// CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: ] // CHECK-NEXT: } diff --git a/clang/test/AST/ast-dump-types-errors.cpp b/clang/test/AST/ast-dump-types-errors.cpp --- a/clang/test/AST/ast-dump-types-errors.cpp +++ b/clang/test/AST/ast-dump-types-errors.cpp @@ -2,5 +2,5 @@ void test() { using ContainsErrors = int[sizeof(undef())]; - // CHECK: DependentSizedArrayType {{.*}} contains-errors dependent + // CHECK: ConstantArrayType {{.*}} 'int[1]' contains-errors dependent 1 } diff --git a/clang/test/Sema/merge-decls.c b/clang/test/Sema/merge-decls.c --- a/clang/test/Sema/merge-decls.c +++ b/clang/test/Sema/merge-decls.c @@ -91,3 +91,11 @@ int x[5]; test7_f(&x); // expected-warning {{incompatible pointer types passing 'int (*)[5]' to parameter of type 'int (*)[10]}} } + +char d; +char x1[sizeof(d.data) == 8]; // expected-error {{member reference base type 'char' is not a structure or union}} +char x1[sizeof(d.data) == 4]; // expected-error {{member reference base type 'char' is not a structure or union}} +char x2[sizeof(d.data) == 8]; // expected-error {{member reference base type 'char' is not a structure or union}} expected-note {{previous definition is here}} +char x2[10]; // expected-error {{redefinition of 'x2' with a different type: 'char[10]' vs 'char[1]'}} +char x3[sizeof(d.data) == 8]; // expected-error {{member reference base type 'char' is not a structure or union}} +char x3[1]; \ No newline at end of file