[cfe-commits] r169467 - in /cfe/trunk: lib/AST/ASTContext.cpp test/SemaCXX/empty-class-layout.cpp
Richard Smith
richard-llvm at metafoo.co.uk
Wed Dec 5 19:04:50 PST 2012
Author: rsmith
Date: Wed Dec 5 21:04:50 2012
New Revision: 169467
URL: http://llvm.org/viewvc/llvm-project?rev=169467&view=rev
Log:
Don't use dyn_cast on a Type* which might not be canonical. Fixes an extremely obscure record layout bug.
Modified:
cfe/trunk/lib/AST/ASTContext.cpp
cfe/trunk/test/SemaCXX/empty-class-layout.cpp
Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=169467&r1=169466&r2=169467&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Wed Dec 5 21:04:50 2012
@@ -3994,7 +3994,8 @@
uint64_t ElementCount = 1;
do {
ElementCount *= CA->getSize().getZExtValue();
- CA = dyn_cast<ConstantArrayType>(CA->getElementType());
+ CA = dyn_cast_or_null<ConstantArrayType>(
+ CA->getElementType()->getAsArrayTypeUnsafe());
} while (CA);
return ElementCount;
}
Modified: cfe/trunk/test/SemaCXX/empty-class-layout.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/empty-class-layout.cpp?rev=169467&r1=169466&r2=169467&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/empty-class-layout.cpp (original)
+++ cfe/trunk/test/SemaCXX/empty-class-layout.cpp Wed Dec 5 21:04:50 2012
@@ -156,3 +156,18 @@
};
SA(0, sizeof(Test) == 2);
}
+
+namespace Test8 {
+ // Test that type sugar doesn't make us incorrectly determine the size of an
+ // array of empty classes.
+ struct Empty1 {};
+ struct Empty2 {};
+ struct Empties : Empty1, Empty2 {};
+ typedef Empty1 Sugar[4];
+ struct A : Empty2, Empties {
+ // This must go at offset 2, because if it were at offset 0,
+ // V[0][1] would overlap Empties::Empty1.
+ Sugar V[1];
+ };
+ SA(0, sizeof(A) == 6);
+}
More information about the cfe-commits
mailing list