]> granicus.if.org Git - clang/commitdiff
x86_64: Structures with no fields but which have padding should be classified as
authorDaniel Dunbar <daniel@zuster.org>
Tue, 22 Dec 2009 01:19:25 +0000 (01:19 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 22 Dec 2009 01:19:25 +0000 (01:19 +0000)
integer.
 - This is consistent, but may not be correct. I will revisit x86_64 ABI handling for C++ as a whole at some point.
 - PR5831.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91874 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TargetABIInfo.cpp
test/CodeGenCXX/member-functions.cpp
test/CodeGenCXX/x86_64-arguments.cpp

index 7be1eadfd9a25f1d70faa85eec66107323c19b28..863a297cc6a5ed1d30ac37e6232e69c0afce9002 100644 (file)
@@ -805,6 +805,10 @@ void X86_64ABIInfo::classify(QualType Ty,
         if (Lo == Memory || Hi == Memory)
           break;
       }
+
+      // If this record has no fields but isn't empty, classify as INTEGER.
+      if (RD->field_empty() && Size)
+        Current = Integer;
     }
 
     // Classify the fields one at a time, merging the results.
index 67038d65d628de113fcf4c73952e41771b452a19..ebc9ed758bec0bd387a5cb944f1d8efd1c3d25c7 100644 (file)
@@ -58,6 +58,6 @@ struct T {
 void test3() {
   T t1, t2;
   
-  // RUN: grep "call void @_ZN1TpsERKS_" %t
+  // RUN: grep "call i64 @_ZN1TpsERKS_" %t
   T result = t1 + t2;
 }
index bdee1bc252ee471d2d408bb5fbb648841a7aa49b..7ebbedc9989ee9995eda40dff596aa6715e0c5ed 100644 (file)
@@ -21,4 +21,7 @@ struct f2_s1 : public f2_s0 { char d;};
 // CHECK: define void @_Z2f25f2_s1([[i64_i64_ty]])
 void f2(f2_s1 a0) { }
 
-
+// PR5831
+struct s3_0 {};
+struct s3_1 { struct s3_0 a; long b; };
+void f3(struct s3_1 x) {}