1*67e74705SXin Li // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li // Check that IR gen doesn't try to do an lvalue-to-rvalue conversion 4*67e74705SXin Li // on a volatile reference result. rdar://problem/8338198 5*67e74705SXin Li namespace test0 { 6*67e74705SXin Li struct A { 7*67e74705SXin Li A(const A& t); 8*67e74705SXin Li A& operator=(const A& t); 9*67e74705SXin Li volatile A& operator=(const volatile A& t) volatile; 10*67e74705SXin Li }; 11*67e74705SXin Li 12*67e74705SXin Li volatile A *array; 13*67e74705SXin Li 14*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test04testENS_1AE( test(A t)15*67e74705SXin Li void test(A t) { 16*67e74705SXin Li // CHECK: [[ARR:%.*]] = load [[A:%.*]]*, [[A:%.*]]** @_ZN5test05arrayE, align 8 17*67e74705SXin Li // CHECK-NEXT: [[IDX:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ARR]], i64 0 18*67e74705SXin Li // CHECK-NEXT: [[TMP:%.*]] = call dereferenceable({{[0-9]+}}) [[A]]* @_ZNV5test01AaSERVKS0_([[A]]* [[IDX]], [[A]]* dereferenceable({{[0-9]+}}) [[T:%.*]]) 19*67e74705SXin Li // CHECK-NEXT: ret void 20*67e74705SXin Li array[0] = t; 21*67e74705SXin Li } 22*67e74705SXin Li } 23*67e74705SXin Li 24*67e74705SXin Li namespace test1 { 25*67e74705SXin Li volatile int *x; 26*67e74705SXin Li 27*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test14testEv() test()28*67e74705SXin Li void test() { 29*67e74705SXin Li // CHECK: [[TMP:%.*]] = load i32*, i32** @_ZN5test11xE, align 8 30*67e74705SXin Li // CHECK-NEXT: ret void 31*67e74705SXin Li *x; 32*67e74705SXin Li } 33*67e74705SXin Li } 34