[cfe-commits] r126113 - in /cfe/trunk: lib/CodeGen/CGExpr.cpp test/CodeGenCXX/conditional-gnu-ext.cpp

John McCall rjmccall at apple.com
Sun Feb 20 21:25:38 PST 2011


Author: rjmccall
Date: Sun Feb 20 23:25:38 2011
New Revision: 126113

URL: http://llvm.org/viewvc/llvm-project?rev=126113&view=rev
Log:
Bind references to opaque r-values correctly.  Add a few test cases
for ?: on record types.


Modified:
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/test/CodeGenCXX/conditional-gnu-ext.cpp

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=126113&r1=126112&r2=126113&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Sun Feb 20 23:25:38 2011
@@ -260,6 +260,10 @@
         }
       }
 
+      if (const OpaqueValueExpr *opaque = dyn_cast<OpaqueValueExpr>(E))
+        if (opaque->getType()->isRecordType())
+          return CGF.EmitOpaqueValueLValue(opaque).getAddress();
+
       // Nothing changed.
       break;
     }

Modified: cfe/trunk/test/CodeGenCXX/conditional-gnu-ext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/conditional-gnu-ext.cpp?rev=126113&r1=126112&r2=126113&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/conditional-gnu-ext.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/conditional-gnu-ext.cpp Sun Feb 20 23:25:38 2011
@@ -60,3 +60,83 @@
   return  global-2;
 }
 }
+
+namespace test3 {
+  struct A {
+    A();
+    A(const A&);
+    ~A();
+  };
+
+  struct B {
+    B();
+    B(const B&);
+    ~B();
+    operator bool();
+    operator A();
+  };
+
+  B test0(B &x) {
+    // CHECK:    define void @_ZN5test35test0ERNS_1BE(
+    // CHECK:      [[X:%.*]] = alloca [[B:%.*]]*,
+    // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
+    // CHECK-NEXT: [[T0:%.*]] = load [[B]]** [[X]]
+    // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
+    // CHECK-NEXT: br i1 [[BOOL]]
+    // CHECK:      call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* [[T0]])
+    // CHECK-NEXT: br label
+    // CHECK:      call void @_ZN5test31BC1Ev([[B]]* [[RESULT]])
+    // CHECK-NEXT: br label
+    // CHECK:      ret void
+    return x ?: B();
+  }
+
+  B test1() {
+    // CHECK:    define void @_ZN5test35test1Ev(
+    // CHECK:      [[TEMP:%.*]] = alloca [[B]],
+    // CHECK-NEXT: call  void @_ZN5test312test1_helperEv([[B]]* sret [[TEMP]])
+    // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
+    // CHECK-NEXT: br i1 [[BOOL]]
+    // CHECK:      call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* [[TEMP]])
+    // CHECK-NEXT: br label
+    // CHECK:      call void @_ZN5test31BC1Ev([[B]]* [[RESULT]])
+    // CHECK-NEXT: br label
+    // CHECK:      call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
+    // CHECK-NEXT: ret void
+    extern B test1_helper();
+    return test1_helper() ?: B();
+  }
+
+
+  A test2(B &x) {
+    // CHECK:    define void @_ZN5test35test2ERNS_1BE(
+    // CHECK:      [[X:%.*]] = alloca [[B]]*,
+    // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
+    // CHECK-NEXT: [[T0:%.*]] = load [[B]]** [[X]]
+    // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
+    // CHECK-NEXT: br i1 [[BOOL]]
+    // CHECK:      call void @_ZN5test31BcvNS_1AEEv([[A:%.*]]* sret [[RESULT:%.*]], [[B]]* [[T0]])
+    // CHECK-NEXT: br label
+    // CHECK:      call void @_ZN5test31AC1Ev([[A]]* [[RESULT]])
+    // CHECK-NEXT: br label
+    // CHECK:      ret void
+    return x ?: A();
+  }
+
+  A test3() {
+    // CHECK:    define void @_ZN5test35test3Ev(
+    // CHECK:      [[TEMP:%.*]] = alloca [[B]],
+    // CHECK-NEXT: call  void @_ZN5test312test3_helperEv([[B]]* sret [[TEMP]])
+    // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
+    // CHECK-NEXT: br i1 [[BOOL]]
+    // CHECK:      call void @_ZN5test31BcvNS_1AEEv([[A]]* sret [[RESULT:%.*]], [[B]]* [[TEMP]])
+    // CHECK-NEXT: br label
+    // CHECK:      call void @_ZN5test31AC1Ev([[A]]* [[RESULT]])
+    // CHECK-NEXT: br label
+    // CHECK:      call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
+    // CHECK-NEXT: ret void
+    extern B test3_helper();
+    return test3_helper() ?: A();
+  }
+
+}





More information about the cfe-commits mailing list