public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it
@ 2022-01-19 10:46 nickhuang99 at hotmail dot com
  2022-01-19 11:01 ` [Bug c++/104113] " pinskia at gcc dot gnu.org
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: nickhuang99 at hotmail dot com @ 2022-01-19 10:46 UTC (permalink / raw)
  To: gcc-bugs

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"

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
@ 2022-01-19 11:01 ` pinskia at gcc dot gnu.org
  2022-01-19 11:05 ` [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic pinskia at gcc dot gnu.org
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-01-19 11:01 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Auto has nothing to do with the problematic error message, take:
template<typename T>
struct A{};
A<tttt> x = A<short>();

GCC still produces:

<source>:4:13: error: cannot convert 'A<short int>' to 'int' in initialization
    4 | A<tttt> x = A<short>();
      |             ^~~~~~~~~~
      |             |
      |             A<short int>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
  2022-01-19 11:01 ` [Bug c++/104113] " pinskia at gcc dot gnu.org
@ 2022-01-19 11:05 ` pinskia at gcc dot gnu.org
  2022-01-19 11:18 ` pinskia at gcc dot gnu.org
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-01-19 11:05 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
            Summary|DR 625 forbids "auto" being |invalid template argument
                   |used in template argument   |causes the type to become
                   |and parser fails to issue   |int which confuses the rest
                   |correct error message for   |of the diagnostic
                   |it                          |
   Last reconfirmed|                            |2022-01-19
     Ever confirmed|0                           |1

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I can't find the bug right now but I think there is another bug which complains
about how we use int for the type after an invalid template argument.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
  2022-01-19 11:01 ` [Bug c++/104113] " pinskia at gcc dot gnu.org
  2022-01-19 11:05 ` [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic pinskia at gcc dot gnu.org
@ 2022-01-19 11:18 ` pinskia at gcc dot gnu.org
  2022-01-19 11:21 ` pinskia at gcc dot gnu.org
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-01-19 11:18 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |FIXME

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
from decl.cc:

      if (type_was_error_mark_node && template_parm_flag)
        /* FIXME we should be able to propagate the error_mark_node as is
           for other contexts too.  */
        type = error_mark_node;
      else
        type = integer_type_node;

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
                   ` (2 preceding siblings ...)
  2022-01-19 11:18 ` pinskia at gcc dot gnu.org
@ 2022-01-19 11:21 ` pinskia at gcc dot gnu.org
  2022-01-21 14:48 ` nickhuang99 at hotmail dot com
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-01-19 11:21 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |pinskia at gcc dot gnu.org
             Status|NEW                         |ASSIGNED
                 CC|                            |pinskia at gcc dot gnu.org

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Doing this for GCC 12 is way too late; it is stage 4. I am going to try to
handle this for GCC 13 though; there might be a few more places in the
front-end that needs to handle error_mark_node but those should be done.
Also I noticed function return types might be an issue too (pt.cc has code
which sets to integer_type_node for that case).

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
                   ` (3 preceding siblings ...)
  2022-01-19 11:21 ` pinskia at gcc dot gnu.org
@ 2022-01-21 14:48 ` nickhuang99 at hotmail dot com
  2022-01-21 15:02 ` nickhuang99 at hotmail dot com
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: nickhuang99 at hotmail dot com @ 2022-01-21 14:48 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from qingzhe huang <nickhuang99 at hotmail dot com> ---
Created attachment 52257
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52257&action=edit
cp_parser_simulate_error  logic

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index b262b765a9a..988631a4248 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -24206,8 +24206,9 @@ cp_parser_type_id_1 (cp_parser *parser, cp_parser_flags
flags,
          /* OK */;
        else
          {
-           if (!cp_parser_simulate_error (parser))
-             {
+               if (parser->context && parser->context->status ==
CP_PARSER_STATUS_KIND_ERROR
+                               && cp_parser_simulate_error (parser))
+                       return error_mark_node;
                location_t loc = type_specifier_seq.locations[ds_type_spec];
                if (tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node))
                  {
@@ -24221,8 +24222,6 @@ cp_parser_type_id_1 (cp_parser *parser, cp_parser_flags
flags,
                            auto_node);
                else
                  error_at (loc, "invalid use of %qT", auto_node);
-             }
-           return error_mark_node;
          }
       }

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
                   ` (4 preceding siblings ...)
  2022-01-21 14:48 ` nickhuang99 at hotmail dot com
@ 2022-01-21 15:02 ` nickhuang99 at hotmail dot com
  2022-01-21 15:44 ` mpolacek at gcc dot gnu.org
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: nickhuang99 at hotmail dot com @ 2022-01-21 15:02 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #6 from qingzhe huang <nickhuang99 at hotmail dot com> ---
How about this simple fix? (see the patch above.) 
Instead of return "error_mark_node" by condition of
"!cp_parser_simulate_error", we now report error immediately. The rational of
this fix is that "cp_parser_simulate_error" is only making sense when we
already see error, i.e. "CP_PARSER_STATUS_KIND_ERROR". Otherwise, we should
just report error.
I did a full build and check, it seems fine with me. For example, 

104091.cpp: In function ‘void g()’:
104091.cpp:8:7: error: ‘auto’ not permitted in template argument
    8 |     A<auto> x = A<short>();
      |       ^~~~
104091.cpp:8:13: error: variable ‘A<auto> x’ has initializer but incomplete
type
    8 |     A<auto> x = A<short>();
      |             ^


Also I noticed previous testcase (i.e. g++.dg/DRs/dr625.C) is too relaxed with
error message by allowing inaccurate "invalid template argument" or "cannot
convert ..." instead of "auto not permitted".

If this makes sense to you, I am happy to provide more testcases and correct
those old testcases.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
                   ` (5 preceding siblings ...)
  2022-01-21 15:02 ` nickhuang99 at hotmail dot com
@ 2022-01-21 15:44 ` mpolacek at gcc dot gnu.org
  2023-08-01  1:26 ` pinskia at gcc dot gnu.org
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2022-01-21 15:44 UTC (permalink / raw)
  To: gcc-bugs

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

Marek Polacek <mpolacek at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mpolacek at gcc dot gnu.org

--- Comment #7 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
That looks wrong, if you want to give an error even when parsing tentatively,
then you should use error_at.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
                   ` (6 preceding siblings ...)
  2022-01-21 15:44 ` mpolacek at gcc dot gnu.org
@ 2023-08-01  1:26 ` pinskia at gcc dot gnu.org
  2023-08-01  1:29 ` pinskia at gcc dot gnu.org
  2024-03-06  2:13 ` pinskia at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-08-01  1:26 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #3)
> from decl.cc:
> 
>       if (type_was_error_mark_node && template_parm_flag)
>         /* FIXME we should be able to propagate the error_mark_node as is
>            for other contexts too.  */
>         type = error_mark_node;
>       else
>         type = integer_type_node;

Changing this to not check template_parm_flag causes a regression in
g++.dg/other/nontype-1.C . What happens is the type that happens here is now
error_mark_node but the parser is not exacting that still. We get instead:
```
t1.cc:3:37: error: expected ‘)’ before ‘,’ token
    3 |            Op::first_argument_type a, // { dg-error "not a type" }
      |                                     ^
      |                                     )
t1.cc:2:11: note: to match this ‘(’
    2 | bool asfun(Op f,
      |           ^
```
Which is totally bad error recovery ...

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
                   ` (7 preceding siblings ...)
  2023-08-01  1:26 ` pinskia at gcc dot gnu.org
@ 2023-08-01  1:29 ` pinskia at gcc dot gnu.org
  2024-03-06  2:13 ` pinskia at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-08-01  1:29 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |NEW
           Assignee|pinskia at gcc dot gnu.org         |unassigned at gcc dot gnu.org

--- Comment #9 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Not going to handle this as there will be many pathes inside the C++ front-end
that will need to be changed to handle error_mark_node rather than just a type
...

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic
  2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
                   ` (8 preceding siblings ...)
  2023-08-01  1:29 ` pinskia at gcc dot gnu.org
@ 2024-03-06  2:13 ` pinskia at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-03-06  2:13 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |f.heckenbach@fh-soft.de

--- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
*** Bug 114248 has been marked as a duplicate of this bug. ***

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2024-03-06  2:13 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-19 10:46 [Bug c++/104113] New: DR 625 forbids "auto" being used in template argument and parser fails to issue correct error message for it nickhuang99 at hotmail dot com
2022-01-19 11:01 ` [Bug c++/104113] " pinskia at gcc dot gnu.org
2022-01-19 11:05 ` [Bug c++/104113] invalid template argument causes the type to become int which confuses the rest of the diagnostic pinskia at gcc dot gnu.org
2022-01-19 11:18 ` pinskia at gcc dot gnu.org
2022-01-19 11:21 ` pinskia at gcc dot gnu.org
2022-01-21 14:48 ` nickhuang99 at hotmail dot com
2022-01-21 15:02 ` nickhuang99 at hotmail dot com
2022-01-21 15:44 ` mpolacek at gcc dot gnu.org
2023-08-01  1:26 ` pinskia at gcc dot gnu.org
2023-08-01  1:29 ` pinskia at gcc dot gnu.org
2024-03-06  2:13 ` pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).