Fix a bug with binding l-values to elided temporaries, and leave a couple
helpful asserts behind.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114250 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGenCXX/temporaries.cpp b/test/CodeGenCXX/temporaries.cpp
index 7996ed6..3bf1dbd 100644
--- a/test/CodeGenCXX/temporaries.cpp
+++ b/test/CodeGenCXX/temporaries.cpp
@@ -340,7 +340,11 @@
 }
 
 namespace Elision {
-  struct A { A(); A(const A &); ~A(); void *p; };
+  struct A {
+    A(); A(const A &); ~A();
+    void *p;
+    void foo() const;
+  };
 
   void foo();
   A fooA();
@@ -475,4 +479,17 @@
 
     // CHECK:      call void @_ZN7Elision1AD1Ev([[A]]* [[X]])
   }
+
+  // Reduced from webkit.
+  // CHECK: define void @_ZN7Elision5test6EPKNS_1CE([[C:%.*]]*
+  struct C { operator A() const; };
+  void test6(const C *x) {
+    // CHECK:      [[T0:%.*]] = alloca [[A]], align 8
+    // CHECK:      [[X:%.*]] = load [[C]]** {{%.*}}, align 8
+    // CHECK-NEXT: call void @_ZNK7Elision1CcvNS_1AEEv([[A]]* sret [[T0]], [[C]]* [[X]])
+    // CHECK-NEXT: call void @_ZNK7Elision1A3fooEv([[A]]* [[T0]])
+    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T0]])
+    // CHECK-NEXT: ret void
+    A(*x).foo();
+  }
 }