aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-03-31 19:01:39 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-03-31 19:01:39 +0000
commit5bde6f41506535ddaf6e9ff60bd1488db8ded952 (patch)
tree81f78dd86d64a75be99f87a73dd949bac3d41410
parentc2542b62a283e571b36f510a02db2c58c92e762b (diff)
x86_32 Darwin ABI: Treat empty unions like empty structures.
- Current return-arguments-32 status: 15/1000 failures git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68132 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CGCall.cpp10
-rw-r--r--test/CodeGen/x86_32-arguments.c12
2 files changed, 15 insertions, 7 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index 8217b046a3..291e476f0b 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -140,11 +140,11 @@ void ABIArgInfo::dump() const {
/***/
-/// isEmptyStruct - Return true iff a structure has no non-empty
+/// isEmptyRecord - Return true iff a structure has no non-empty
/// members. Note that a structure with a flexible array member is not
/// considered empty.
-static bool isEmptyStruct(QualType T) {
- const RecordType *RT = T->getAsStructureType();
+static bool isEmptyRecord(QualType T) {
+ const RecordType *RT = T->getAsRecordType();
if (!RT)
return 0;
const RecordDecl *RD = RT->getDecl();
@@ -153,7 +153,7 @@ static bool isEmptyStruct(QualType T) {
for (RecordDecl::field_iterator i = RD->field_begin(),
e = RD->field_end(); i != e; ++i) {
const FieldDecl *FD = *i;
- if (!isEmptyStruct(FD->getType()))
+ if (!isEmptyRecord(FD->getType()))
return false;
}
return true;
@@ -182,7 +182,7 @@ static const FieldDecl *isSingleElementStruct(QualType T) {
const FieldDecl *FD = *i;
QualType FT = FD->getType();
- if (isEmptyStruct(FT)) {
+ if (isEmptyRecord(FT)) {
// Ignore
} else if (Found) {
return 0;
diff --git a/test/CodeGen/x86_32-arguments.c b/test/CodeGen/x86_32-arguments.c
index 632949e763..9334895186 100644
--- a/test/CodeGen/x86_32-arguments.c
+++ b/test/CodeGen/x86_32-arguments.c
@@ -15,8 +15,6 @@
// tests. This should be the same as @f8_2.
// RUN: grep 'define void @f9_2(%.truct.s9\* byval %a0)' %t &&
-// RUN: true
-
char f0(void) {
}
@@ -65,3 +63,13 @@ struct s9 f9_1(void) {
void f9_2(struct s9 a0) {
}
+// Return of small structures and unions...
+
+// RUN: grep 'float @f10()' %t &&
+struct s10 {
+ union { };
+ float f;
+} f10(void) {}
+
+// RUN: true
+