114 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -fclang-abi-compat=latest -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s2// RUN: %clang_cc1 -std=c++20 -fclang-abi-compat=latest -emit-llvm %s -o - -triple=x86_64-linux-gnu | llvm-cxxfilt -n | FileCheck %s --check-prefix DEMANGLED3 4template<typename T>5struct wrapper1 {6 union {7 struct {8 T RightName;9 };10 };11};12 13template<typename T>14struct wrapper2 {15 union {16 struct {17 T RightName;18 };19 T WrongName;20 };21};22 23struct Base {24 int WrongName;25};26 27template <typename T>28struct wrapper3 {29 union {30 struct : Base {31 T RightName; };32 T WrongName;33 };34};35 36template <typename T>37struct wrapper4 {38 union {39 int RightName;40 struct {41 T WrongName;42 };43 T AlsoWrongName;44 };45};46 47template <typename T>48struct wrapper5 {49 union {50 struct {51 struct {52 T RightName;53 };54 T WrongName;55 };56 };57};58 59template<typename T>60struct wrapper6 {61 union {62 union{63 int : 5;64 T RightName;65 };66 };67};68 69 70 71template<auto tparam> void dummy(){}72 73 74void uses() {75 // Zero init'ed cases.76 dummy<wrapper1<int>{}>();77 // CHECK: call void @_Z5dummyITnDaXtl8wrapper1IiEEEEvv78 // DEMANGLED: call void @void dummy<wrapper1<int>{}>()()79 dummy<wrapper2<float>{}>();80 // CHECK: call void @_Z5dummyITnDaXtl8wrapper2IfEEEEvv81 // DEMANGLED: call void @void dummy<wrapper2<float>{}>()()82 dummy<wrapper3<short>{}>();83 // CHECK: call void @_Z5dummyITnDaXtl8wrapper3IsEEEEvv84 // DEMANGLED: call void @void dummy<wrapper3<short>{}>()()85 dummy<wrapper4<double>{}>();86 // CHECK: call void @_Z5dummyITnDaXtl8wrapper4IdEEEEvv87 // DEMANGLED: call void @void dummy<wrapper4<double>{}>()()88 dummy<wrapper5<long long>{}>();89 // CHECK: call void @_Z5dummyITnDaXtl8wrapper5IxEEEEvv90 // DEMANGLED: call void @void dummy<wrapper5<long long>{}>()()91 dummy<wrapper6<int>{}>();92 // CHECK: call void @_Z5dummyITnDaXtl8wrapper6IiEEEEvv93 // DEMANGLED: call void @void dummy<wrapper6<int>{}>()()94 95 dummy<wrapper1<double>{123.0}>();96 // CHECK: call void @_Z5dummyITnDaXtl8wrapper1IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_ELd405ec00000000000EEEEEEvv97 // DEMANGLED: call void @void dummy<wrapper1<double>{wrapper1<double>::'unnamed'{.RightName = wrapper1<double>::'unnamed'::'unnamed'{0x1.ec{{.*}}p+6}}}>()()98 dummy<wrapper2<double>{123.0}>();99 // CHECK: call void @_Z5dummyITnDaXtl8wrapper2IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_ELd405ec00000000000EEEEEEvv100 // DEMANGLED: call void @void dummy<wrapper2<double>{wrapper2<double>::'unnamed'{.RightName = wrapper2<double>::'unnamed'::'unnamed'{0x1.ec{{.*}}p+6}}}>()()101 dummy<wrapper3<double>{123, 456}>();102 // CHECK: call void @_Z5dummyITnDaXtl8wrapper3IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_Etl4BaseLi123EELd407c800000000000EEEEEEvv103 // DEMANGLED: call void @void dummy<wrapper3<double>{wrapper3<double>::'unnamed'{.RightName = wrapper3<double>::'unnamed'::'unnamed'{Base{123}, 0x1.c8{{.*}}p+8}}}>()()104 dummy<wrapper4<double>{123}>();105 // CHECK: call void @_Z5dummyITnDaXtl8wrapper4IdEtlNS1_Ut_Edi9RightNameLi123EEEEEvv106 // DEMANGLED: call void @void dummy<wrapper4<double>{wrapper4<double>::'unnamed'{.RightName = 123}}>()()107 dummy<wrapper5<double>{123.0, 456.0}>();108 // CHECK: call void @_Z5dummyITnDaXtl8wrapper5IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_EtlNS3_Ut_ELd405ec00000000000EELd407c800000000000EEEEEEvv109 // DEMANGLED: call void @void dummy<wrapper5<double>{wrapper5<double>::'unnamed'{.RightName = wrapper5<double>::'unnamed'::'unnamed'{wrapper5<double>::'unnamed'::'unnamed'::'unnamed'{0x1.ec{{.*}}p+6}, 0x1.c8{{.*}}p+8}}}>()()110 dummy<wrapper6<double>{1}>();111 // CHECK: call void @_Z5dummyITnDaXtl8wrapper6IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_Edi9RightNameLd3ff0000000000000EEEEEEvv112 // DEMANGELD: call void @void dummy<wrapper6<double>{wrapper6<double>::'unnamed'{.RightName = wrapper6<double>::'unnamed'::'unnamed'{.RightName = 0x1{{.*}}p+0}}}>()() 113}114