xref: /aosp_15_r20/external/clang/test/CodeGenCXX/microsoft-uuidof-mangling.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li template <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 Li template <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 Li int 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