================
@@ -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

Reply via email to