1*67e74705SXin Li // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 2*67e74705SXin Li struct A { 3*67e74705SXin Li void f(); 4*67e74705SXin Li 5*67e74705SXin Li int a; 6*67e74705SXin Li }; 7*67e74705SXin Li 8*67e74705SXin Li struct B : A { 9*67e74705SXin Li double b; 10*67e74705SXin Li }; 11*67e74705SXin Li f()12*67e74705SXin Livoid f() { 13*67e74705SXin Li B b; 14*67e74705SXin Li 15*67e74705SXin Li b.f(); 16*67e74705SXin Li } 17*67e74705SXin Li 18*67e74705SXin Li // CHECK: define %struct.B* @_Z1fP1A(%struct.A* %a) [[NUW:#[0-9]+]] f(A * a)19*67e74705SXin LiB *f(A *a) { 20*67e74705SXin Li // CHECK-NOT: br label 21*67e74705SXin Li // CHECK: ret %struct.B* 22*67e74705SXin Li return static_cast<B*>(a); 23*67e74705SXin Li } 24*67e74705SXin Li 25*67e74705SXin Li // PR5965 26*67e74705SXin Li namespace PR5965 { 27*67e74705SXin Li 28*67e74705SXin Li // CHECK: define %struct.A* @_ZN6PR59651fEP1B(%struct.B* %b) [[NUW]] f(B * b)29*67e74705SXin LiA *f(B* b) { 30*67e74705SXin Li // CHECK-NOT: br label 31*67e74705SXin Li // CHECK: ret %struct.A* 32*67e74705SXin Li return b; 33*67e74705SXin Li } 34*67e74705SXin Li 35*67e74705SXin Li } 36*67e74705SXin Li 37*67e74705SXin Li // Don't crash on a derived-to-base conversion of an r-value 38*67e74705SXin Li // aggregate. 39*67e74705SXin Li namespace test3 { 40*67e74705SXin Li struct A {}; 41*67e74705SXin Li struct B : A {}; 42*67e74705SXin Li 43*67e74705SXin Li void foo(A a); test()44*67e74705SXin Li void test() { 45*67e74705SXin Li foo(B()); 46*67e74705SXin Li } 47*67e74705SXin Li } 48*67e74705SXin Li 49*67e74705SXin Li // CHECK: attributes [[NUW]] = { nounwind{{.*}} } 50