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

            Bug ID: 104113
           Summary: DR 625 forbids "auto" being used in template argument
                    and parser fails to issue correct error message for it
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nickhuang99 at hotmail dot com
  Target Milestone: ---

DR 625 forbids "auto" to be used in template argument. And developer has
specific error message for this and fails to issue it for the very case:
(https://www.godbolt.org/z/198fn1jr1)

template <class T> struct A {};
template <class T> void f(A<T> x) {}

void g()
{
    f(A<short>());

    A<auto> x = A<short>();
}


The error message is very misleading. Note that only the 2nd error message is
parser confirmed error message which is considered as conversion issue instead
of "auto" being forbidden to be in template argument. (The 1st error message is
parser tentative parsing issued.)

<source>: In function 'void g()':
<source>:14:11: error: template argument 1 is invalid
   14 |     A<auto> x = A<short>();
      |           ^
<source>:14:17: error: cannot convert 'A<short int>' to 'int' in initialization
   14 |     A<auto> x = A<short>();
      |                 ^~~~~~~~~~
      |                 |
      |                 A<short int>



And this case can be reduced as 

template<typename T>
struct A{};
A<auto> x = A<short>();

This is related to PR104091, however, it is very different because this one is
not affected by "-std=c++XX"

Reply via email to