1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -std=c++1y -O1 -disable-llvm-optzns %s -o - | FileCheck %s -check-prefix=CHECKA -check-prefix=CHECK 2*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -std=c++1y -O1 -disable-llvm-optzns -fcxx-exceptions %s -o - | FileCheck %s -check-prefix=CHECKB -check-prefix=CHECK 3*67e74705SXin Li // expected-no-diagnostics 4*67e74705SXin Li 5*67e74705SXin Li // The variable template specialization x<Foo> generated in each file 6*67e74705SXin Li // should be 'internal global' and not 'linkonce_odr global'. 7*67e74705SXin Li 8*67e74705SXin Li template <typename T> int x = 42; 9*67e74705SXin Li 10*67e74705SXin Li // CHECK-DAG: @_Z1xIZL3foovE3FooE = internal global 11*67e74705SXin Li 12*67e74705SXin Li // CHECK-DAG: define internal dereferenceable(4) i32* @_ZL3foov( foo()13*67e74705SXin Listatic int &foo() { 14*67e74705SXin Li struct Foo { }; 15*67e74705SXin Li 16*67e74705SXin Li // CHECK-DAG: ret i32* @_Z1xIZL3foovE3FooE 17*67e74705SXin Li return x<Foo>; 18*67e74705SXin Li } 19*67e74705SXin Li 20*67e74705SXin Li 21*67e74705SXin Li #if !__has_feature(cxx_exceptions) // File A 22*67e74705SXin Li // CHECKA-DAG: define dereferenceable(4) i32* @_Z3barv( bar()23*67e74705SXin Liint &bar() { 24*67e74705SXin Li // CHECKA-DAG: call dereferenceable(4) i32* @_ZL3foov() 25*67e74705SXin Li return foo(); 26*67e74705SXin Li } 27*67e74705SXin Li 28*67e74705SXin Li #else // File B 29*67e74705SXin Li 30*67e74705SXin Li // CHECKB-DAG: declare dereferenceable(4) i32* @_Z3barv( 31*67e74705SXin Li int &bar(); 32*67e74705SXin Li main()33*67e74705SXin Liint main() { 34*67e74705SXin Li // CHECKB-DAG: call dereferenceable(4) i32* @_Z3barv() 35*67e74705SXin Li // CHECKB-DAG: call dereferenceable(4) i32* @_ZL3foov() 36*67e74705SXin Li &bar() == &foo() ? throw 0 : (void)0; // Should not throw exception at runtime. 37*67e74705SXin Li } 38*67e74705SXin Li 39*67e74705SXin Li #endif // end of Files A and B 40*67e74705SXin Li 41