diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-07-14 23:40:24 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-07-14 23:40:24 +0000 |
commit | 37de611c0f4deb72ac85aac4381622cd355bdd26 (patch) | |
tree | c7e5e439b66f1514284449b61fe48a1fb6cfd216 /clang/test/CodeGenCXX/microsoft-templ-uuidof.cpp | |
parent | 6be46b8ae56b7c20db9d46496940b678eef22771 (diff) | |
download | bcm5719-llvm-37de611c0f4deb72ac85aac4381622cd355bdd26.tar.gz bcm5719-llvm-37de611c0f4deb72ac85aac4381622cd355bdd26.zip |
AST: Fix __uuidof for template specializations
While we previously supported __uuidof applied to a template
specialization, we would only find the uuid attribute if it was applied
to the template argument. We would erroneously ignore the uuid
attribute on the specialization itself.
This is required to parse Windows Runtime C++ Template Library headers.
llvm-svn: 213016
Diffstat (limited to 'clang/test/CodeGenCXX/microsoft-templ-uuidof.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/microsoft-templ-uuidof.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/microsoft-templ-uuidof.cpp b/clang/test/CodeGenCXX/microsoft-templ-uuidof.cpp new file mode 100644 index 00000000000..0ee39086383 --- /dev/null +++ b/clang/test/CodeGenCXX/microsoft-templ-uuidof.cpp @@ -0,0 +1,37 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - -DDEFINE_GUID -triple=i386-pc-win32 -fms-extensions | FileCheck %s --check-prefix=CHECK + +struct _GUID; + +template <typename> +struct X { +}; + +struct __declspec(uuid("{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}")) A {}; + +struct B {}; + +template <> +struct __declspec(uuid("{BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}")) X<B> {}; + +struct __declspec(uuid("{CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC}")) C {}; + +const _GUID &xa = __uuidof(X<A>); +// CHECK-DAG: @"\01?xa@@3ABU_GUID@@B" = {{.*}} @_GUID_aaaaaaaa_aaaa_aaaa_aaaa_aaaaaaaaaaaa + +const _GUID &xb = __uuidof(X<B>); +// CHECK-DAG: @"\01?xb@@3ABU_GUID@@B" = {{.*}} @_GUID_bbbbbbbb_bbbb_bbbb_bbbb_bbbbbbbbbbbb +const _GUID &xc = __uuidof(X<C>); +// CHECK-DAG: @"\01?xc@@3ABU_GUID@@B" = {{.*}} @_GUID_cccccccc_cccc_cccc_cccc_cccccccccccc + +template <> +struct __declspec(uuid("{DDDDDDDD-DDDD-DDDD-DDDD-DDDDDDDDDDDD}")) X<C> {}; + +template <typename> +struct __declspec(uuid("{EEEEEEEE-EEEE-EEEE-EEEE-EEEEEEEEEEEE}")) Y { +}; + +const _GUID &xd = __uuidof(X<C>); +// CHECK-DAG: @"\01?xd@@3ABU_GUID@@B" = {{.*}} @_GUID_dddddddd_dddd_dddd_dddd_dddddddddddd + +const _GUID &yd = __uuidof(Y<X<C> >); +// CHECK-DAG: @"\01?yd@@3ABU_GUID@@B" = {{.*}} @_GUID_dddddddd_dddd_dddd_dddd_dddddddddddd |