microsoft-uuidof-mangling.cpp 1.4 KB

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