diff options
Diffstat (limited to 'gcc/testsuite/g++.dg')
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle73.C | 96 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/nontype-class23.C | 102 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/array53.C | 33 |
3 files changed, 231 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/abi/mangle73.C b/gcc/testsuite/g++.dg/abi/mangle73.C new file mode 100644 index 00000000000..2a5322a37c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle73.C @@ -0,0 +1,96 @@ +// { dg-do compile { target c++2a } } + +struct A +{ + char a[2][2]; +}; + +template <A> struct B { }; + +typedef B<A{ { { 0, 0 }, { 0, 0 } } }> AZZZZ; +typedef B<A{ { { 0, 0 }, { 0 } } }> AZZZ_; +typedef B<A{ { { 0, 0 } } }> AZZ__; +typedef B<A{ { { 0 } } }> AZ___; +typedef B<A{ { { } } }> A____; + +typedef B<A{ { { "" }, { "" } } }> AS_S_; +typedef B<A{ { { "" }, { 0, 0 } } }> AS_ZZ; +typedef B<A{ { { "" }, { 0 } } }> AS_Z_; +typedef B<A{ { { "" } } }> AS___; + + +// Verify that the types mangle the same. +void a_zzzz (AZZZZ) { } +// { dg-final { scan-assembler "_Z6a_zzzz1BIXtl1AEEE" } } + +void a_zzz_ (AZZZ_) { } +// { dg-final { scan-assembler "_Z6a_zzz_1BIXtl1AEEE" } } + +void a_zz__ (AZZ__) { } +// { dg-final { scan-assembler "_Z6a_zz__1BIXtl1AEEE" } } + +void a_z___ (AZ___) { } +// { dg-final { scan-assembler "_Z6a_z___1BIXtl1AEEE" } } + +void a_____ (A____) { } +// { dg-final { scan-assembler "_Z6a_____1BIXtl1AEEE" } } + +void a_s_s_ (AS_S_) { } +// { dg-final { scan-assembler "_Z6a_s_s_1BIXtl1AEEE" } } + +void a_s_zz (AS_ZZ) { } +// { dg-final { scan-assembler "_Z6a_s_zz1BIXtl1AEEE" } } + +void a_s_z_ (AS_Z_) { } +// { dg-final { scan-assembler "_Z6a_s_z_1BIXtl1AEEE" } } + +void a_s___ (AS___) { } +// { dg-final { scan-assembler "_Z6a_s___1BIXtl1AEEE" } } + + +struct C +{ + struct { const char a[2][2], *p; } a[2]; +}; + +template <C> struct D { }; + +typedef D<C{{{{{ 0, 0 }, { 0, 0 }}, 0 }, {{{ 0, 0 }, { 0, 0 }}, 0 }}}> DZZZZZZZZZZ; +typedef D<C{{{{{ 0, 0 }, { 0, 0 }}, 0 }, {{{ 0, 0 }, { 0, 0 }}}}}> DZZZZZZZZZ_; +typedef D<C{{{{{ 0, 0 }, { 0, 0 }}, 0 }, {{{ 0, 0 }, { 0 }}}}}> DZZZZZZZZ__; +typedef D<C{{{{{ 0, 0 }, { 0, 0 }}, 0 }, {{{ 0, 0 } }}}}> DZZZZZZZ___; +typedef D<C{{{{{ 0, 0 }, { 0, 0 }}, 0 }, {{{ 0 } }}}}> DZZZZZZ____; +typedef D<C{{{{{ 0, 0 }, { 0, 0 }}, 0 }}}> DZZZZZ_____; +typedef D<C{{{{{ 0, 0 }, { 0, 0 }}}}}> DZZZZ______; +typedef D<C{{{{{ 0, 0 }, { 0 }}}}}> DZZZ_______; +typedef D<C{{{{{ 0, 0 }}}}}> DZZ________; +typedef D<C{{{{{ 0 }}}}}> DZ_________; +typedef D<C{ }> D__________; + +typedef D<C{{{{{ "" }, { "" }}, 0 }, {{{ "" }, { "" }}, 0 }}}> DS_S_ZS_S_Z; + +void d_zzzzzzzzzz (DZZZZZZZZZZ) { } +// { dg-final { scan-assembler "_Z12d_zzzzzzzzzz1DIXtl1CEEE" } } +void d_zzzzzzzzz_ (DZZZZZZZZZ_) { } +// { dg-final { scan-assembler "_Z12d_zzzzzzzzz_1DIXtl1CEEE" } } +void d_zzzzzzzz__ (DZZZZZZZZ__) { } +// { dg-final { scan-assembler "_Z12d_zzzzzzzz__1DIXtl1CEEE" } } +void d_zzzzzzz___ (DZZZZZZZ___) { } +// { dg-final { scan-assembler "_Z12d_zzzzzzz___1DIXtl1CEEE" } } +void d_zzzzzz____ (DZZZZZZ____) { } +// { dg-final { scan-assembler "_Z12d_zzzzzz____1DIXtl1CEEE" } } +void d_zzzzz_____ (DZZZZZ_____) { } +// { dg-final { scan-assembler "_Z12d_zzzzz_____1DIXtl1CEEE" } } +void d_zzzz______ (DZZZZ______) { } +// { dg-final { scan-assembler "_Z12d_zzzz______1DIXtl1CEEE" } } +void d_zzz_______ (DZZZ_______) { } +// { dg-final { scan-assembler "_Z12d_zzz_______1DIXtl1CEEE" } } +void d_zz________ (DZZ________) { } +// { dg-final { scan-assembler "_Z12d_zz________1DIXtl1CEEE" } } +void d_z_________ (DZ_________) { } +// { dg-final { scan-assembler "_Z12d_z_________1DIXtl1CEEE" } } +void d___________ (D__________) { } +// { dg-final { scan-assembler "_Z12d___________1DIXtl1CEEE" } } + +void d_s_s_zs_s_z (DS_S_ZS_S_Z) { } +// { dg-final { scan-assembler "_Z12d_s_s_zs_s_z1DIXtl1CEEE" } } diff --git a/gcc/testsuite/g++.dg/cpp2a/nontype-class23.C b/gcc/testsuite/g++.dg/cpp2a/nontype-class23.C new file mode 100644 index 00000000000..ab9e80fd335 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/nontype-class23.C @@ -0,0 +1,102 @@ +// PR c++/90947 - Simple lookup table of array of strings is miscompiled +// Test to verify that the same specializations on non-type template +// parameters of class types are in fact treated as the same. Unlike +// nontype-class15.C which involves only one-dimensional arrays this +// test involves arrays of arrays and arrays of structs. +// { dg-do compile { target c++2a } } + +struct AA3 +{ + const char a[2][2][2]; +}; + +template <AA3> struct BAA3 { }; + +// Redeclare the same variable using different initialization forms +// of the same constant to verify that they are in fact all recognized +// as the same. +extern BAA3<AA3{{{ "", "" }, { "", "" }}}> baa3; +extern BAA3<AA3{{{ "", "" }, { "", { 0, 0 } }}}> baa3; +extern BAA3<AA3{{{ "", "" }, { "", { 0 } }}}> baa3; +extern BAA3<AA3{{{ "", "" }, { "", {} }}}> baa3; +extern BAA3<AA3{{{ "", "" }, { "" }}}> baa3; +extern BAA3<AA3{{{ "", "" }, { { 0, 0 } }}}> baa3; +extern BAA3<AA3{{{ "", "" }, { { 0 } }}}> baa3; +extern BAA3<AA3{{{ "", "" }, { {} }}}> baa3; +extern BAA3<AA3{{{ "", "" }, { }}}> baa3; +extern BAA3<AA3{{{ "", "" }}}> baa3; +extern BAA3<AA3{{{ "", { 0, 0 } }}}> baa3; +extern BAA3<AA3{{{ "", { 0 } }}}> baa3; +extern BAA3<AA3{{{ "", {} }}}> baa3; +extern BAA3<AA3{{{ "" }}}> baa3; +extern BAA3<AA3{{{ { 0, 0 } }}}> baa3; +extern BAA3<AA3{{{ { 0 } }}}> baa3; +extern BAA3<AA3{{{ {} }}}> baa3; +extern BAA3<AA3{{{ }}}> baa3; +extern BAA3<AA3{{ }}> baa3; +extern BAA3<AA3{ }> baa3; + +extern BAA3<AA3{{{ "", "" }, { "", "1" }}}> baa3_1; +extern BAA3<AA3{{{ "", "" }, { "", { '1', 0 } }}}> baa3_1; +extern BAA3<AA3{{{ "", "" }, { "", { '1' } }}}> baa3_1; + +extern BAA3<AA3{{{ "", "" }, { "1", {} }}}> baa3_2; +extern BAA3<AA3{{{ "", "" }, { "1" }}}> baa3_2; +extern BAA3<AA3{{{ "", "" }, { { '1', 0 } }}}> baa3_2; +extern BAA3<AA3{{{ "", "" }, { { '1' } }}}> baa3_2; + +extern BAA3<AA3{{{ "", "1" }}}> baa3_3; +extern BAA3<AA3{{{ "", { '1', 0 } }}}> baa3_3; +extern BAA3<AA3{{{ "", { '1' } }}}> baa3_3; + +extern BAA3<AA3{{{ "1" }}}> baa3_4; +extern BAA3<AA3{{{ { '1', 0 } }}}> baa3_4; +extern BAA3<AA3{{{ { '1' } }}}> baa3_4; + +struct AS2 +{ + struct S { const char a[2], *p; } a[2]; +}; + +template <AS2> struct BAS2 { }; + +extern BAS2<AS2{{{ "", 0 }, { "", 0 }}}> bas2; +extern BAS2<AS2{{{ "", 0 }, { {}, 0 }}}> bas2; +extern BAS2<AS2{{{ "", 0 }, { "" }}}> bas2; +extern BAS2<AS2{{{ "", 0 }, { {} }}}> bas2; +extern BAS2<AS2{{{ "", 0 }, { }}}> bas2; +extern BAS2<AS2{{{ "", 0 }}}> bas2; +extern BAS2<AS2{{{ {}, 0 }}}> bas2; +extern BAS2<AS2{{{ "" }}}> bas2; +extern BAS2<AS2{{{ {} }}}> bas2; +extern BAS2<AS2{{{ }}}> bas2; +extern BAS2<AS2{{ }}> bas2; +extern BAS2<AS2{ }> bas2; + +struct AS2_2 +{ + struct S { const char a[2], *p; } a[2][2]; +}; + +template <AS2_2> struct BAS2_2 { }; + +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 } }, { { "", 0 }, { "", 0 }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 } }, { { "", 0 }, { "" }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 } }, { { "", 0 }, { {} }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 } }, { { "", 0 }, { }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 } }, { { "", 0 } }}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 } }, { { "" } }}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 } }, { { {} } }}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 } }, { { }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 } }, { }}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "", 0 }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { "" }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { {} }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }, { }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "", 0 }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ "" }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ {} }}}}> b2_2; +extern BAS2_2<AS2_2{{{{ }}}}> b2_2; +extern BAS2_2<AS2_2{{{ }}}> b2_2; +extern BAS2_2<AS2_2{{ }}> b2_2; +extern BAS2_2<AS2_2{ }> b2_2; diff --git a/gcc/testsuite/g++.dg/init/array53.C b/gcc/testsuite/g++.dg/init/array53.C new file mode 100644 index 00000000000..2bf480561fe --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array53.C @@ -0,0 +1,33 @@ +// PR c++/90947 - Simple lookup table of array of strings is miscompiled +// Verify that initializers for arrays of elements of a class type with +// "unusual" data members are correctly recognized as non-zero. +// { dg-do compile } +// { dg-options "-O1 -fdump-tree-optimized" } + +struct S +{ + const char *p; + static int i; + enum { e }; + typedef int X; + int: 1, b:1; + union { + int c; + }; + const char *q; +}; + +void f (void) +{ + const struct S a[2] = + { + { /* .p = */ "", /* .b = */ 0, /* .c = */ 0, /* .q = */ "" }, + { /* .p = */ "", /* .b = */ 0, /* .c = */ 0, /* .q = */ "" } + }; + + if (!a[0].p || *a[0].p || !a[0].q || *a[0].q + || !a[1].p || *a[1].p || !a[1].q || *a[1].q) + __builtin_abort (); +} + +// { dg-final { scan-tree-dump-not "abort" "optimized" } } |