<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/97021>97021</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang fails to parse type alias in explicit calling of template member function with `->template `
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Rush10233
      </td>
    </tr>
</table>

<pre>
    Please consider the following code:

```c++
template <typename T>
struct A {
    int a() {
        return 42;
    }
};

template <typename T>
struct B {
    
    using MUT_1 = A<T>;
    int b(MUT_1 *p) {
        return p->template MUT_1::a();
 }
};

int main() {  
  A<int> a;
  B<int> b;
    return b.b(&a);
}
```

Clang rejects it by complaining that:

```c++
<source>:13:28: error: a template argument list is expected after a name prefixed by the template keyword [-Wmissing-template-arg-list-after-template-kw]
   13 |         return p->template MUT_1::a();
      | ^
<source>:13:33: error: expected ';' after return statement
   13 | return p->template MUT_1::a();
      | ^
      |                                 ;
<source>:13:28: error: no member named 'MUT_1' in 'A<int>'
   13 |         return p->template MUT_1::a();
      |                ~           ^
<source>:20:14: note: in instantiation of member function 'B<int>::b' requested here
   20 | return b.b(&a);
```

It seems the compiler does not correctly understand the type alias expression of `using MUT_1 = A<T>;`. Directly using `A<T>` without setting up an alias won't trigger any error. Additionally, GCC also accepts this code.

Please check [https://godbolt.org/z/oYre1GEh3](https://godbolt.org/z/oYre1GEh3)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVV-PozYQ_zTOyygRsQOEBx6yyebUh0pVdVXVp8qYCbhnbGqb20sf-tmrISQkq-7etTqEdok9Hv_-zNgyBN1YxJKlTyw9LOQQW-fLn4fQrhMuxKJy9bn8yaAMCMrZoGv0EFuEkzPGvWjbgHI1MrFjyYEl179ZcnkV40_0jqMRu97IiMDEPp57tLJD-MjE82U6RD-oCDtg-bQAAEDbCJLxLePF4wQ9HuPgLWw4E3czLD9MMPLDbeK_QHh63Gn-GgIR_vGXj7-vgYkD7JjYj6vFK8QV49spjO_697D3Syaeb7DGNSSm2E2k59Tv0KItO6ntrNOMmjBqG5l4BnmH82kerh7gT7iqVTVmy-Q9iBnD1eF7GHsjbQMe_0AVA-gI1RmUI2raknCxlfGbKoWJfXCDVzhqu1sLJnZ8y8QO0Hvn6UPCTTTpm6FDG8HoEEEHwC89qog1yFNEDxJGm3uPJ_0Fa0JFFXxb_wnPL87XwNKn5a-dDmTy8jq7lL5ZUuLlmGwe__TC0sNNtrUAlu_hf5sLl8LdA0uf39ZAiAcNbjwZzykVzyfG0_YhyoikzGuY3wHePPS1Zy6er7tqHXTYVehHy0ZiF1g8B23p51zORPq7y__q-fuexxvO8ITIbC7wIx2FBFXbEKWNWkbtLLjTlddpsGocYjyfe_ACqyKaHv8cMJCrLXq84ePJvXNvdOe_NeUPEQJiF8aap27UBj3UDgPBBeW8RxXNGQZboyfQ9aU9zj2CNFqO_eQxhIkIy5L3zsEsWcFBX3OOgSxLbhFZAi86tm4gWDHS9NCDtNNWL84ynkeIXjcN9a49X6pjBbu61qScNObM-B4-7PcgTXAglcI-EkEdxttodc__enm1qD5Ri7cx9oH05kfGj42rK2fiyvmG8eNfjB_dbx7XH55bQe3Nt98ezotFXYq6EIVcYLnO10WardN8u2hLXuWF2KhNKkReVIkSJ5luVVbkvDipTOFClzzhmyTj2yRPC7FdqUptZC3EqV6LtFKSbRLspDYrYz53tP1ChzBgWeQJXy-MrNCE8RLnXNEpzDin-9yXFL-shiawTULHWJgzRB0NlmM4nKQ2AaKDXvrwYL625L_RSkdQ0hhyzJ3m0_N1XZO75PhD77EsWQzelK_U1LEdqpVyHeNHgjX9W_be0R3C-HFkGRg_Xoh-Lvk_AQAA__8sun3e">