summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-12-29 23:02:58 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-12-29 23:02:58 +0000
commit7bcde197d75fa40c982e47668dcfac2258f55296 (patch)
treef737e4e7b078668feef9af9665d6357bc9fda373
parentbd530a8e83c9903a74b1e538fdfb3bf91a07afa0 (diff)
downloadbcm5719-llvm-7bcde197d75fa40c982e47668dcfac2258f55296.tar.gz
bcm5719-llvm-7bcde197d75fa40c982e47668dcfac2258f55296.zip
Fix PR8796.
The problem was that we were asserting the we never added an empty class to the same offset twice. This is not true for unions, where two members, empty or not, can have the some offset. llvm-svn: 122633
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp8
-rw-r--r--clang/test/CodeGenCXX/empty-classes.cpp13
2 files changed, 18 insertions, 3 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index 34d4a7e5865..143fc61da2b 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -216,10 +216,12 @@ void EmptySubobjectMap::AddSubobjectAtOffset(const CXXRecordDecl *RD,
if (!RD->isEmpty())
return;
+ // If we have empty structures inside an union, we can assign both
+ // the same offset. Just avoid pushing them twice in the list.
ClassVectorTy& Classes = EmptyClassOffsets[Offset];
- assert(std::find(Classes.begin(), Classes.end(), RD) == Classes.end() &&
- "Duplicate empty class detected!");
-
+ if (std::find(Classes.begin(), Classes.end(), RD) != Classes.end())
+ return;
+
Classes.push_back(RD);
// Update the empty class offset.
diff --git a/clang/test/CodeGenCXX/empty-classes.cpp b/clang/test/CodeGenCXX/empty-classes.cpp
index 59124e3d55b..1ce1dad40ff 100644
--- a/clang/test/CodeGenCXX/empty-classes.cpp
+++ b/clang/test/CodeGenCXX/empty-classes.cpp
@@ -53,6 +53,19 @@ int f() {
return 0;
}
+namespace PR8796 {
+ struct FreeCell {
+ };
+ union ThingOrCell {
+ FreeCell t;
+ FreeCell cell;
+ };
+ struct Things {
+ ThingOrCell things;
+ };
+ Things x;
+}
+
#ifdef HARNESS
extern "C" void printf(const char *, ...);
OpenPOWER on IntegriCloud