Reapply "[clang] Avoid re-evaluating field bitwidth" (#122289) GitOrigin-RevId: cfe26358e3051755961fb1f3b46328dc2c326895
diff --git a/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 06c04c9..47051f2 100644 --- a/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -7433,6 +7433,8 @@ bit_width = new (clang_ast) clang::IntegerLiteral(clang_ast, bitfield_bit_size_apint, clang_ast.IntTy, clang::SourceLocation()); + bit_width = clang::ConstantExpr::Create( + clang_ast, bit_width, APValue(llvm::APSInt(bitfield_bit_size_apint))); } clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
diff --git a/test/Shell/SymbolFile/DWARF/x86/no_unique_address-with-bitfields.cpp b/test/Shell/SymbolFile/DWARF/x86/no_unique_address-with-bitfields.cpp index 980180e..297fb82 100644 --- a/test/Shell/SymbolFile/DWARF/x86/no_unique_address-with-bitfields.cpp +++ b/test/Shell/SymbolFile/DWARF/x86/no_unique_address-with-bitfields.cpp
@@ -13,7 +13,9 @@ // CHECK: |-FieldDecl {{.*}} data 'char[5]' // CHECK-NEXT: |-FieldDecl {{.*}} padding 'Empty' // CHECK-NEXT: `-FieldDecl {{.*}} flag 'unsigned long' -// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 +// CHECK-NEXT: `-ConstantExpr {{.*}} +// CHECK-NEXT: |-value: Int 1 +// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 struct Empty {}; struct Empty2 {}; @@ -33,7 +35,9 @@ // CHECK-NEXT: |-FieldDecl {{.*}} p2 'Empty2' // CHECK-NEXT: |-FieldDecl {{.*}} p3 'Empty3' // CHECK-NEXT: `-FieldDecl {{.*}} flag 'unsigned long' -// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 +// CHECK-NEXT: `-ConstantExpr {{.*}} +// CHECK-NEXT: |-value: Int 1 +// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 struct ConsecutiveOverlap { char data[5]; @@ -51,10 +55,14 @@ // CHECK: |-FieldDecl {{.*}} data 'char[5]' // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' // CHECK-NEXT: |-FieldDecl {{.*}} f1 'unsigned long' -// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 +// CHECK-NEXT: | `-ConstantExpr {{.*}} +// CHECK-NEXT: | |-value: Int 1 +// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 // CHECK-NEXT: |-FieldDecl {{.*}} p2 'Empty2' // CHECK-NEXT: `-FieldDecl {{.*}} f2 'unsigned long' -// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 +// CHECK-NEXT: | `-ConstantExpr {{.*}} +// CHECK-NEXT: | |-value: Int 1 +// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 struct MultipleAtOffsetZero { char data[5]; @@ -74,10 +82,14 @@ // CHECK: |-FieldDecl {{.*}} data 'char[5]' // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' // CHECK-NEXT: |-FieldDecl {{.*}} f1 'unsigned long' -// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 +// CHECK-NEXT: | `-ConstantExpr {{.*}} +// CHECK-NEXT: | |-value: Int 1 +// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 // CHECK-NEXT: |-FieldDecl {{.*}} p2 'Empty' // CHECK-NEXT: `-FieldDecl {{.*}} f2 'unsigned long' -// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 +// CHECK-NEXT: | `-ConstantExpr {{.*}} +// CHECK-NEXT: | |-value: Int 1 +// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 struct MultipleEmpty { char data[5]; @@ -93,12 +105,18 @@ // CHECK: CXXRecordDecl {{.*}} struct FieldBitfieldOverlap definition // CHECK: |-FieldDecl {{.*}} a 'int' -// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 3 +// CHECK-NEXT: | `-ConstantExpr {{.*}} +// CHECK-NEXT: | |-value: Int 3 +// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 3 // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' // CHECK-NEXT: |-FieldDecl {{.*}} b 'int' -// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 6 +// CHECK-NEXT: | `-ConstantExpr {{.*}} +// CHECK-NEXT: | |-value: Int 6 +// CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 6 // CHECK-NEXT: `-FieldDecl {{.*}} c 'int' -// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 +// CHECK-NEXT: `-ConstantExpr {{.*}} +// CHECK-NEXT: |-value: Int 1 +// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 struct FieldBitfieldOverlap { int a : 3;