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

            Bug ID: 71138
           Summary: [concepts] ill-formed non-constant expression use in
                    nested requirement produces duplicated diagnostics
                    with poor source locations
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tom at honermann dot net
                CC: andrew.n.sutton at gmail dot com, asutton at gcc dot gnu.org
  Target Milestone: ---

The following test case is ill-formed and gcc r236238 correctly rejects it. 
However, duplicate diagnostic are issued and the diagnostics fail to identify
the problematic source code.

The test case contains two instances of constraint satisfaction failures
labeled #1 and #2.  The first occurs in a static_assert and produces a single
error message.  The second occurs in overload resolution and produces three
duplicate error messages.

None of the diagnostics produce identify the problematic source code annotated
in the test case.

$ cat t.cpp
template<typename T>
constexpr bool p(T) { return true; }
template<typename T>
concept bool C = requires(T t) {
    requires p(t); // An error should be reported here.
};

static_assert(C<int>); // #1: error: ‘t’ is not a constant expression

template<C T>
int f(T) { return 1; }
auto x = f(1); // #2: (3x) error: ‘t’ is not a constant expression


$ svn info
Path: .
Working Copy Root Path: /home/tom/src/gcc-trunk
URL: svn://gcc.gnu.org/svn/gcc/trunk
Relative URL: ^/trunk
Repository Root: svn://gcc.gnu.org/svn/gcc
Repository UUID: 138bc75d-0d04-0410-961f-82ee72b054a4
Revision: 236239
Node Kind: directory
Schedule: normal
Last Changed Author: uros
Last Changed Rev: 236238
Last Changed Date: 2016-05-14 05:07:13 -0400 (Sat, 14 May 2016)

$ g++ --version
g++ (GCC) 7.0.0 20160514 (experimental)
...

$ g++ -c -std=c++1z -fconcepts t.cpp
t.cpp:8:15: error: ‘t’ is not a constant expression
 static_assert(C<int>); // #1: error: ‘t’ is not a constant expression
               ^~~~~~
t.cpp:12:13: error: ‘t’ is not a constant expression
 auto x = f(1); // #2: (3x) error: ‘t’ is not a constant expression
             ^
t.cpp:12:13: error: ‘t’ is not a constant expression
t.cpp:12:13: error: cannot call function ‘int f(T) [with T = int]’
t.cpp:11:5: note:   constraints not satisfied
 int f(T) { return 1; }
     ^
t.cpp:12:13: error: ‘t’ is not a constant expression
 auto x = f(1); // #2: (3x) error: ‘t’ is not a constant expression
             ^
t.cpp:11:5: note:   concept ‘C<int>’ was not satisfied
 int f(T) { return 1; }
     ^

Reply via email to