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;