Bug 99678 - [concepts] requires-clause allows undeclared identifier
Summary: [concepts] requires-clause allows undeclared identifier
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 11.0
: P3 normal
Target Milestone: 14.2
Assignee: Patrick Palka
URL:
Keywords: accepts-invalid
: 114946 115429 (view as bug list)
Depends on:
Blocks:
 
Reported: 2021-03-20 04:17 UTC by 康桓瑋
Modified: 2024-06-17 14:27 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2024-06-12 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description 康桓瑋 2021-03-20 04:17:27 UTC
https://godbolt.org/z/reG8qE

====

void bar(auto) requires undeclared_identifier;

====

GCC accepts this code.
Comment 1 Patrick Palka 2024-05-07 14:12:30 UTC
*** Bug 114946 has been marked as a duplicate of this bug. ***
Comment 2 Patrick Palka 2024-05-07 14:13:59 UTC
From PR114946:

(In reply to Nathaniel Shead from comment #0)
> The following sample compiles fine with 'g++ -std=c++20 -pedantic-errors':
> 
>   template <typename T>
>     requires xxxx
>   struct S {};
> 
>   template <typename T>
>     requires xxxx
>   void foo() {}
> 
> Note that 'xxxx' has not been declared or defined.  Both MSVC and Clang
> complain about the undeclared identifier.  GCC does error if we attempt to
> instantiate either of these specialisations, but they always (silently) lose
> to a better match:
> 
>   template <typename T> struct S {};
>   template <typename T> requires xxxx struct S<T> {};
> 
>   template <typename T> void foo() {}
>   template <typename T> requires xxxx void foo() {}
> 
>   int main() {
>     S<int> x;
>     foo<int>();
>   }
Comment 3 Patrick Palka 2024-06-12 18:25:06 UTC
*** Bug 115429 has been marked as a duplicate of this bug. ***
Comment 4 GCC Commits 2024-06-13 14:16:26 UTC
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>:

https://gcc.gnu.org/g:d387ecb2b2f44f33fd6a7c5ec7eadaf6dd70efc9

commit r15-1294-gd387ecb2b2f44f33fd6a7c5ec7eadaf6dd70efc9
Author: Patrick Palka <ppalka@redhat.com>
Date:   Thu Jun 13 10:16:10 2024 -0400

    c++: undeclared identifier in requires-clause [PR99678]
    
    Since the terms of a requires-clause are grammatically primary-expressions
    and not e.g. postfix-expressions, it seems we need to explicitly handle
    and diagnose the case where a term parses to a bare unresolved identifier,
    like cp_parser_postfix_expression does, since cp_parser_primary_expression
    leaves that up to its callers.  Otherwise we incorrectly accept the first
    three requires-clauses below.
    
    Note that the only occurrences of primary-expression in the grammar are
    postfix-expression and constraint-logical-and-expression, so it's not too
    surprising that we need this special handling here.
    
            PR c++/99678
    
    gcc/cp/ChangeLog:
    
            * parser.cc (cp_parser_constraint_primary_expression): Diagnose
            a bare unresolved unqualified-id.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/concepts-requires38.C: New test.
    
    Reviewed-by: Jason Merrill <jason@redhat.com>
Comment 5 GCC Commits 2024-06-17 14:26:32 UTC
The releases/gcc-14 branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>:

https://gcc.gnu.org/g:20cda2e85c307096a3856f7f27215b8a28982fb6

commit r14-10320-g20cda2e85c307096a3856f7f27215b8a28982fb6
Author: Patrick Palka <ppalka@redhat.com>
Date:   Thu Jun 13 10:16:10 2024 -0400

    c++: undeclared identifier in requires-clause [PR99678]
    
    Since the terms of a requires-clause are grammatically primary-expressions
    and not e.g. postfix-expressions, it seems we need to explicitly handle
    and diagnose the case where a term parses to a bare unresolved identifier,
    like cp_parser_postfix_expression does, since cp_parser_primary_expression
    leaves that up to its callers.  Otherwise we incorrectly accept the first
    three requires-clauses below.
    
    Note that the only occurrences of primary-expression in the grammar are
    postfix-expression and constraint-logical-and-expression, so it's not too
    surprising that we need this special handling here.
    
            PR c++/99678
    
    gcc/cp/ChangeLog:
    
            * parser.cc (cp_parser_constraint_primary_expression): Diagnose
            a bare unresolved unqualified-id.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/concepts-requires38.C: New test.
    
    Reviewed-by: Jason Merrill <jason@redhat.com>
    (cherry picked from commit d387ecb2b2f44f33fd6a7c5ec7eadaf6dd70efc9)
Comment 6 Patrick Palka 2024-06-17 14:27:48 UTC
Fixed for GCC 14.2, thanks for the bug report.