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;