r11-4926 made __alignof__ get mangled differently from alignof, encoding __alignof__ as a vendor extended operator. But this mangling is problematic for the reasons mentioned in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88115#c6. This patch changes our mangling of __alignof__ to instead use the new "vendor extended expression" syntax that's proposed in https://github.com/itanium-cxx-abi/cxx-abi/issues/112. Clang does the same thing already, so after this patch Clang and GCC agree about the mangling of __alignof__(type) and __alignof__(expr). gcc/cp/ChangeLog: PR c++/88115 * mangle.c (write_expression): Adjust the mangling of __alignof__. include/ChangeLog: PR c++/88115 * demangle.h (enum demangle_component_type): Add DEMANGLE_COMPONENT_VENDOR_EXPR. libiberty/ChangeLog: PR c++/88115 * cp-demangle.c (d_dump, d_make_comp, d_expression_1) (d_count_templates_scopes): Handle DEMANGLE_COMPONENT_VENDOR_EXPR. (d_print_comp_inner): Likewise. <case DEMANGLE_COMPONENT_EXTENDED_OPERATOR>: Revert r11-4926 change. <case DEMANGLE_COMPONENT_UNARY>: Likewise. * testsuite/demangle-expected: Adjust __alignof__ tests. gcc/testsuite/ChangeLog: PR c++/88115 * g++.dg/cpp0x/alignof7.C: Adjust expected mangling.
23 lines
799 B
C
23 lines
799 B
C
// PR c++/88115
|
|
// { dg-do compile { target c++11 } }
|
|
// { dg-additional-options "-Wno-pedantic" }
|
|
|
|
// Verify we mangle __alignof__ differently from alignof.
|
|
|
|
#include <cstddef>
|
|
|
|
template <class T> void f1(decltype(alignof(T))) { }
|
|
template <class T> void f2(decltype(alignof(T{}))) { }
|
|
template <class T> void f3(decltype(__alignof__(T))) { }
|
|
template <class T> void f4(decltype(__alignof__(T{}))) { }
|
|
|
|
template void f1<int>(std::size_t);
|
|
template void f2<int>(std::size_t);
|
|
template void f3<int>(std::size_t);
|
|
template void f4<int>(std::size_t);
|
|
|
|
// { dg-final { scan-assembler "_Z2f1IiEvDTatT_E" } }
|
|
// { dg-final { scan-assembler "_Z2f2IiEvDTaztlT_EE" } }
|
|
// { dg-final { scan-assembler "_Z2f3IiEvDTu11__alignof__T_EE" } }
|
|
// { dg-final { scan-assembler "_Z2f4IiEvDTu11__alignof__XtlT_EEEE" } }
|