================
@@ -50,3 +52,112 @@ int main() {
// CHECK: @_Z3fooITnDaLDmta4TypeEEvv
return 0;
}
+
+struct Record {};
+struct WithType { using type = int; };
+using Alias = Record;
+using Pointer = int *;
+Pointer pointer;
+template <auto R> void reflect() {}
+
+template <auto R> struct Reflected {};
+template <class T> Reflected<^^T *> dependent() { return {}; }
+
+void test() {
+ // CHECK: call void @_Z7reflectITnDaLDmtyP6RecordEEvv()
+ reflect<^^Record *>();
+ // CHECK: call void @_Z7reflectITnDaLDmtyA3_iEEvv()
+ reflect<^^int[3]>();
+ // CHECK: call void @_Z7reflectITnDaLDmtyFviEEEvv()
+ reflect<^^void(int)>();
+ // CHECK: call void @_Z7reflectITnDaLDmtyM6RecordiEEvv()
+ reflect<^^int Record::*>();
+ // CHECK: call void @_Z7reflectITnDaLDmta5AliasEEvv()
+ reflect<^^Alias>();
+ // CHECK: call void @_Z7reflectITnDaLDmtyDv4_iEEvv()
+ reflect<^^int __attribute__((ext_vector_type(4)))>();
+ // CHECK: call void @_Z7reflectITnDaLDmtyU13block_pointerFviEEEvv()
+ reflect<^^void (^)(int)>();
+ // CHECK: call void @_Z7reflectITnDaLDmtyDB17_EEvv()
+ reflect<^^_BitInt(17)>();
+ // CHECK: call {{.*}} @_Z9dependentIiE9ReflectedILDmtyPT_EEv()
+ dependent<int>();
+ // CHECK: call void @_Z7reflectITnDaLDmtyPiEEvv()
+ reflect<^^decltype(pointer)>();
+ // CHECK: call void @_Z7reflectITnDaLDmta7PointerEEvv()
+ reflect<^^Pointer>();
+ // CHECK: call void @_Z7reflectITnDaLDmtyiEEvv()
+ reflect<^^typename WithType::type>();
+}
+
+template<class... Ts> void pack_index_type() {
+ reflect<^^Ts...[0]>();
+}
+void instantiate_pack_index() {
+ pack_index_type<Record>();
+}
+// CHECK: define {{.*}} @_Z15pack_index_typeIJ6RecordEEvv()
+// CHECK: call void @_Z7reflectITnDaLDmty6RecordEEvv()
+
+namespace AliasTemplates {
+template <class T = int> using A = T;
+template <class T> using B = T;
+template <unsigned N, unsigned M = N + 1> using Numbers = int;
+template <class... Ts> using Pack = int;
+template <class T, class... Ts> using MixedPack = int;
+template <template <class> class... TTs> using Templates = int;
+template <class T> using Ignored = int;
+template <info R> using Reflection = int;
+namespace Nested { template <class T> using Alias = T; }
+template <class T> struct Owner { template <class U> using Alias = int; };
+template <class T> Reflected<^^A<T>> dependent_alias() { return {}; }
+// CHECK-LABEL: define {{.*}} @_ZN14AliasTemplates5callsEv()
+void calls() {
+ // CHECK: call void @_Z7reflectITnDaLDmtaN14AliasTemplates1AIiEEEEvv()
+ reflect<^^A<>>();
+ // CHECK: call void @_Z7reflectITnDaLDmtaN14AliasTemplates1AIiEEEEvv()
+ reflect<^^A<int>>();
+ // CHECK: call void @_Z7reflectITnDaLDmtaN14AliasTemplates1BIiEEEEvv()
+ reflect<^^B<int>>();
+ // CHECK: call void
@_Z7reflectITnDaLDmtaN14AliasTemplates7NumbersILj2ELj3EEEEEvv()
+ reflect<^^Numbers<1 + 1>>();
+ // CHECK: call void
@_Z7reflectITnDaLDmtaN14AliasTemplates7NumbersILj2ELj3EEEEEvv()
+ reflect<^^Numbers<2, 3>>();
+ // CHECK: call void @_Z7reflectITnDaLDmtaN14AliasTemplates4PackIJifEEEEEvv()
+ reflect<^^Pack<int, float>>();
+ // CHECK: call void
@_Z7reflectITnDaLDmtaN14AliasTemplates9MixedPackIiJfdEEEEEvv()
+ reflect<^^MixedPack<int, float, double>>();
+ // CHECK: call void @_Z7reflect{{.*}}9TemplatesIJ{{.*}}EEEEEvv()
+ reflect<^^Templates<A, B>>();
+ // CHECK: call void
@_Z7reflectITnDaLDmtaN14AliasTemplates6Nested5AliasIiEEEEvv()
+ reflect<^^Nested::Alias<int>>();
+ // CHECK: call void
@_Z7reflectITnDaLDmtaN14AliasTemplates5OwnerIiE5AliasIfEEEEvv()
+ reflect<^^Owner<int>::Alias<float>>();
+ // CHECK: call void @_Z7reflectITnDaLDmtaN14AliasTemplates7IgnoredIiEEEEvv()
+ reflect<^^Ignored<int>>();
+ // CHECK: call void @_Z7reflectITnDaLDmtaN14AliasTemplates7IgnoredIfEEEEvv()
+ reflect<^^Ignored<float>>();
----------------
ojhunt wrote:
Pinging @rjmccall and @ahatanak in case they have any thoughts as well
https://github.com/llvm/llvm-project/pull/232074
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits