]> granicus.if.org Git - clang/commitdiff
fix PR7742 / rdar://8250764, a miscompilation of struct
authorChris Lattner <sabre@nondot.org>
Thu, 29 Jul 2010 17:04:54 +0000 (17:04 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 29 Jul 2010 17:04:54 +0000 (17:04 +0000)
return where the struct has a base but no fields.  This
was because the x86-64 abi logic was checking the wrong
predicate in one place.

This was introduced in r91874, which was a fix for PR5831,
which lacked a CHECK line, so I verified and added it.

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

lib/CodeGen/TargetInfo.cpp
test/CodeGenCXX/x86_64-arguments.cpp

index 8729da9e1754c0918ff6560a948c94cbc35faddc..0d8d3a9dff359eb0f125a6220b4639060c45da9e 100644 (file)
@@ -1026,8 +1026,9 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
           break;
       }
 
-      // If this record has no fields but isn't empty, classify as INTEGER.
-      if (RD->field_empty() && Size)
+      // If this record has no fields, no bases, no vtable, but isn't empty,
+      // classify as INTEGER.
+      if (CXXRD->isEmpty() && Size)
         Current = Integer;
     }
 
index 6c42bb817095de37b09794be9e14ed2b6bc2daf8..5dc79899c5e3a239bb1c399ae6060d1033aa6711 100644 (file)
@@ -19,6 +19,7 @@ struct f2_s1 : public f2_s0 { char d;};
 void f2(f2_s1 a0) { }
 
 // PR5831
+// CHECK: define void @_Z2f34s3_1(i8 %x.coerce0, i64 %x.coerce1)
 struct s3_0 {};
 struct s3_1 { struct s3_0 a; long b; };
 void f3(struct s3_1 x) {}
@@ -44,4 +45,19 @@ void foo() {
   // CHECK: call void @_ZN6PR752310AddKeywordENS_9StringRefEi(i8* {{.*}}, i32 4)
   AddKeyword(StringRef(), 4);
 }
+}
+
+
+
+namespace PR7742 { // Also rdar://8250764
+  struct s2 {
+    float a[2];
+  };
+  
+  struct c2 : public s2 {};
+  
+  // CHECK: define double @_ZN6PR77423fooEPNS_2c2E(%"struct.PR7742::c2"* %P)
+  c2 foo(c2 *P) {
+  }
+  
 }
\ No newline at end of file