summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2011-02-02 19:36:18 +0000
committerFariborz Jahanian <fjahanian@apple.com>2011-02-02 19:36:18 +0000
commit09b2331cf7a03a8f372edfb5123048a86d8b4df7 (patch)
treea84fcc949483268aa29683ad0d8c8a2d30b6b357 /clang/lib/AST/RecordLayoutBuilder.cpp
parentac18130050830f4632e8d703c97572c322a56ce2 (diff)
downloadbcm5719-llvm-09b2331cf7a03a8f372edfb5123048a86d8b4df7.tar.gz
bcm5719-llvm-09b2331cf7a03a8f372edfb5123048a86d8b4df7.zip
For gcc compatibility, size of a class which is zero
but has non-empty data fields, such as array of zero length, remains zero. // rdar://8945175 llvm-svn: 124741
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index 730ec213580..a871c3d1766 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -1469,8 +1469,17 @@ void RecordLayoutBuilder::LayoutField(const FieldDecl *D) {
void RecordLayoutBuilder::FinishLayout(const NamedDecl *D) {
// In C++, records cannot be of size 0.
- if (Context.getLangOptions().CPlusPlus && Size == 0)
- Size = 8;
+ if (Context.getLangOptions().CPlusPlus && Size == 0) {
+ if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
+ // Compatibility with gcc requires a class (pod or non-pod)
+ // which is not empty but of size 0; such as having fields of
+ // array of zero-length, remains of Size 0
+ if (RD->isEmpty())
+ Size = 8;
+ }
+ else
+ Size = 8;
+ }
// Finally, round the size of the record up to the alignment of the
// record itself.
uint64_t UnpaddedSize = Size - UnfilledBitsInLastByte;
OpenPOWER on IntegriCloud