1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-unknown-unknown -fms-extensions | FileCheck %s 2*67e74705SXin Li // rdar://17784718 3*67e74705SXin Li 4*67e74705SXin Li typedef struct _GUID 5*67e74705SXin Li { 6*67e74705SXin Li unsigned int Data1; 7*67e74705SXin Li unsigned short Data2; 8*67e74705SXin Li unsigned short Data3; 9*67e74705SXin Li unsigned char Data4[ 8 ]; 10*67e74705SXin Li } GUID; 11*67e74705SXin Li 12*67e74705SXin Li 13*67e74705SXin Li template < typename T, const GUID & T_iid = __uuidof(T)> 14*67e74705SXin Li class UUIDTest 15*67e74705SXin Li { 16*67e74705SXin Li public: UUIDTest()17*67e74705SXin Li UUIDTest() { } 18*67e74705SXin Li }; 19*67e74705SXin Li 20*67e74705SXin Li struct __declspec(uuid("EAFA1952-66F8-438B-8FBA-AF1BBAE42191")) TestStruct 21*67e74705SXin Li { 22*67e74705SXin Li int foo; 23*67e74705SXin Li }; 24*67e74705SXin Li test_uuidofType(void * arg[sizeof (__uuidof (T))]=0)25*67e74705SXin Litemplate <class T> void test_uuidofType(void *arg[sizeof(__uuidof(T))] = 0) {} 26*67e74705SXin Li test_uuidofExpr(void * arg[sizeof (__uuidof (T::member))]=0)27*67e74705SXin Litemplate <class T> void test_uuidofExpr(void *arg[sizeof(__uuidof(T::member))] = 0) {} 28*67e74705SXin Li 29*67e74705SXin Li struct HasMember { typedef TestStruct member; }; 30*67e74705SXin Li main(int argc,const char * argv[])31*67e74705SXin Liint main(int argc, const char * argv[]) 32*67e74705SXin Li { 33*67e74705SXin Li 34*67e74705SXin Li UUIDTest<TestStruct> uuidof_test; 35*67e74705SXin Li test_uuidofType<TestStruct>(); 36*67e74705SXin Li test_uuidofExpr<HasMember>(); 37*67e74705SXin Li return 0; 38*67e74705SXin Li } 39*67e74705SXin Li 40*67e74705SXin Li // CHECK: define i32 @main 41*67e74705SXin Li // CHECK: call void @_ZN8UUIDTestI10TestStructXu8__uuidoftS0_EEC1Ev 42*67e74705SXin Li // CHECK: call void @_Z15test_uuidofTypeI10TestStructEvPPv(i8** null) 43*67e74705SXin Li // CHECK: call void @_Z15test_uuidofExprI9HasMemberEvPPv(i8** null) 44*67e74705SXin Li 45*67e74705SXin Li // CHECK: define linkonce_odr void @_ZN8UUIDTestI10TestStructXu8__uuidoftS0_EEC1Ev 46*67e74705SXin Li // CHECK: define linkonce_odr void @_Z15test_uuidofTypeI10TestStructEvPPv 47*67e74705SXin Li // CHECK: define linkonce_odr void @_Z15test_uuidofExprI9HasMemberEvPPv 48*67e74705SXin Li // CHECK: define linkonce_odr void @_ZN8UUIDTestI10TestStructXu8__uuidoftS0_EEC2Ev 49