diff options
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
| -rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index d1de70a7ab8..a674ad79709 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -640,13 +640,16 @@ void ASTRecordLayoutBuilder::LayoutWideBitField(uint64_t FieldSize, // We're not going to use any of the unfilled bits in the last byte. UnfilledBitsInLastByte = 0; - // The bitfield is allocated starting at the next offset aligned appropriately - // for T', with length n bits. - uint64_t FieldOffset = llvm::RoundUpToAlignment(DataSize, TypeAlign); - + uint64_t FieldOffset; + if (IsUnion) { DataSize = std::max(DataSize, FieldSize); + FieldOffset = 0; } else { + // The bitfield is allocated starting at the next offset aligned appropriately + // for T', with length n bits. + FieldOffset = llvm::RoundUpToAlignment(DataSize, TypeAlign); + uint64_t NewSizeInBits = FieldOffset + FieldSize; DataSize = llvm::RoundUpToAlignment(NewSizeInBits, 8); |

