// RUN: %clang_cc1 -std=c++20 -fclang-abi-compat=latest -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s // 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 DEMANGLED template struct wrapper1 { union { struct { T RightName; }; }; }; template struct wrapper2 { union { struct { T RightName; }; T WrongName; }; }; struct Base { int WrongName; }; template struct wrapper3 { union { struct : Base { T RightName; }; T WrongName; }; }; template struct wrapper4 { union { int RightName; struct { T WrongName; }; T AlsoWrongName; }; }; template struct wrapper5 { union { struct { struct { T RightName; }; T WrongName; }; }; }; template struct wrapper6 { union { union{ int : 5; T RightName; }; }; }; template void dummy(){} void uses() { // Zero init'ed cases. dummy{}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper1IiEEEEvv // DEMANGLED: call void @void dummy{}>()() dummy{}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper2IfEEEEvv // DEMANGLED: call void @void dummy{}>()() dummy{}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper3IsEEEEvv // DEMANGLED: call void @void dummy{}>()() dummy{}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper4IdEEEEvv // DEMANGLED: call void @void dummy{}>()() dummy{}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper5IxEEEEvv // DEMANGLED: call void @void dummy{}>()() dummy{}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper6IiEEEEvv // DEMANGLED: call void @void dummy{}>()() dummy{123.0}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper1IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_ELd405ec00000000000EEEEEEvv // DEMANGLED: call void @void dummy{wrapper1::'unnamed'{.RightName = wrapper1::'unnamed'::'unnamed'{0x1.ec{{.*}}p+6}}}>()() dummy{123.0}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper2IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_ELd405ec00000000000EEEEEEvv // DEMANGLED: call void @void dummy{wrapper2::'unnamed'{.RightName = wrapper2::'unnamed'::'unnamed'{0x1.ec{{.*}}p+6}}}>()() dummy{123, 456}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper3IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_Etl4BaseLi123EELd407c800000000000EEEEEEvv // DEMANGLED: call void @void dummy{wrapper3::'unnamed'{.RightName = wrapper3::'unnamed'::'unnamed'{Base{123}, 0x1.c8{{.*}}p+8}}}>()() dummy{123}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper4IdEtlNS1_Ut_Edi9RightNameLi123EEEEEvv // DEMANGLED: call void @void dummy{wrapper4::'unnamed'{.RightName = 123}}>()() dummy{123.0, 456.0}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper5IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_EtlNS3_Ut_ELd405ec00000000000EELd407c800000000000EEEEEEvv // DEMANGLED: call void @void dummy{wrapper5::'unnamed'{.RightName = wrapper5::'unnamed'::'unnamed'{wrapper5::'unnamed'::'unnamed'::'unnamed'{0x1.ec{{.*}}p+6}, 0x1.c8{{.*}}p+8}}}>()() dummy{1}>(); // CHECK: call void @_Z5dummyITnDaXtl8wrapper6IdEtlNS1_Ut_Edi9RightNametlNS2_Ut_Edi9RightNameLd3ff0000000000000EEEEEEvv // DEMANGELD: call void @void dummy{wrapper6::'unnamed'{.RightName = wrapper6::'unnamed'::'unnamed'{.RightName = 0x1{{.*}}p+0}}}>()() }