https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121655

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|[13/14/15/16 Regression]    |[13/14/15/16 Regression]
                   |struct binding as template  |struct binding as template
                   |argument vs                 |argument vs
                   |reinterpret_cast            |reinterpret_cast since
                   |                            |r8-4678
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |jason at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
For
template<char &E> void f();
struct test_t { char a; } t;
test_t& dummy_object = t;
auto& [v0] = dummy_object;
void g()
{ 
  f<v0>();
} 
g++ disagrees with clang++ on how to mangle it.
GCC mangles it as
_Z1fIXdtL_Z1tE1aEEvv
demangled as
void f<t.a>()
while clang as
_Z1fIXsocL_Z1tEEEEvv
which binutils demangler doesn't demangle but llvm-cxxfilt demangles as
void f<t.<char at offset 0> >()
For #c1, clang rejects it:
<source>:8:3: error: no matching function for call to 'f'
    8 |   f<v0>();
      |   ^~~~~
<source>:1:24: note: candidate template ignored: invalid explicitly-specified
argument for template parameter 'E'
    1 | template<char &E> void f();
      |                        ^
while GCC ICEs, apparently because mangle_decl gives up on it:
4562      /* Don't bother mangling uninstantiated templates.  */
4563      ++processing_template_decl;
4564      if (TREE_CODE (decl) == TYPE_DECL)
4565        dep = dependent_type_p (TREE_TYPE (decl));
4566      else
4567        dep = (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
4568               && any_dependent_template_arguments_p (DECL_TI_ARGS
(decl)));
4569      --processing_template_decl;
4570      if (dep)
4571        return;
but caller expects mangle_decl to set DECL_ASSEMBLER_NAME.

The ICE started with r8-4678-g6296cf8e099aae43c86a773f93d83a19df85d7e7

Reply via email to