public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/110497] New: Wrong error on non-static data member referenced in concept definition
@ 2023-06-30  9:23 fchelnokov at gmail dot com
  2023-06-30  9:41 ` [Bug c++/110497] " redi at gcc dot gnu.org
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: fchelnokov at gmail dot com @ 2023-06-30  9:23 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 110497
           Summary: Wrong error on non-static data member referenced in
                    concept definition
           Product: gcc
           Version: 13.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fchelnokov at gmail dot com
  Target Milestone: ---

This program

struct B {
    const bool b = true;
};

template <typename T>
concept C = T::b;
static_assert( !C<B> );

is accepted in Clang. And I think correctly accepted because of substitution
failure per https://eel.is/c++draft/temp.constr.constr#temp.constr.op-5

> [...] Furthermore, if substitution to determine whether an atomic constraint is satisfied ([temp.constr.atomic]) encounters a substitution failure, the constraint is not satisfied, regardless of the presence of a negation operator.

But GCC emits a weird error (at least the error text must be adjusted):

error: '*(B*)(void)0' is not a constant expression

Online demo: https://gcc.godbolt.org/z/xKf13cb6v

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

* [Bug c++/110497] Wrong error on non-static data member referenced in concept definition
  2023-06-30  9:23 [Bug c++/110497] New: Wrong error on non-static data member referenced in concept definition fchelnokov at gmail dot com
@ 2023-06-30  9:41 ` redi at gcc dot gnu.org
  2023-06-30 13:44 ` ppalka at gcc dot gnu.org
  2023-07-02  8:08 ` daniel-dev at hotmail dot de
  2 siblings, 0 replies; 4+ messages in thread
From: redi at gcc dot gnu.org @ 2023-06-30  9:41 UTC (permalink / raw)
  To: gcc-bugs

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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |rejects-valid
   Last reconfirmed|                            |2023-06-30
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1

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

* [Bug c++/110497] Wrong error on non-static data member referenced in concept definition
  2023-06-30  9:23 [Bug c++/110497] New: Wrong error on non-static data member referenced in concept definition fchelnokov at gmail dot com
  2023-06-30  9:41 ` [Bug c++/110497] " redi at gcc dot gnu.org
@ 2023-06-30 13:44 ` ppalka at gcc dot gnu.org
  2023-07-02  8:08 ` daniel-dev at hotmail dot de
  2 siblings, 0 replies; 4+ messages in thread
From: ppalka at gcc dot gnu.org @ 2023-06-30 13:44 UTC (permalink / raw)
  To: gcc-bugs

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

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Blocks|                            |67491
                 CC|                            |ppalka at gcc dot gnu.org

--- Comment #1 from Patrick Palka <ppalka at gcc dot gnu.org> ---
It seems we're issuing a hard error during satisfaction here because
substitution failure didn't occur, and the substituted constraint is
non-constant which renders the program ill-formed as per
[temp.constr.atomic]/3:

> If substitution results in an invalid type or expression, the constraint is not satisfied. Otherwise, the lvalue-to-rvalue conversion is performed if necessary, and E shall be a constant expression of type bool.

One might argue substitution failure should occur for T::b with T=B, but this
seems to be permitted by [expr.prim.id.general]/3 since constraint-expressions
are unevaluated contexts.

Note that if we use B::b directly in the concept definition then Clang also
rejects the program due to non-constant satisfaction rule:

struct B { const bool b = true; };
template <typename T>
concept C = B::b;
static_assert( !C<B> );

error: substitution into constraint expression resulted in a non-constant
expression

So GCC might be correct to reject the original program.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67491
[Bug 67491] [meta-bug] concepts issues

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

* [Bug c++/110497] Wrong error on non-static data member referenced in concept definition
  2023-06-30  9:23 [Bug c++/110497] New: Wrong error on non-static data member referenced in concept definition fchelnokov at gmail dot com
  2023-06-30  9:41 ` [Bug c++/110497] " redi at gcc dot gnu.org
  2023-06-30 13:44 ` ppalka at gcc dot gnu.org
@ 2023-07-02  8:08 ` daniel-dev at hotmail dot de
  2 siblings, 0 replies; 4+ messages in thread
From: daniel-dev at hotmail dot de @ 2023-07-02  8:08 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Daniel <daniel-dev at hotmail dot de> ---
Just some observations:

There was a similar discussion in

https://stackoverflow.com/questions/75443227/static-assert-on-an-ill-formed-no-diagnostic-required-expression


Note that if we use anything else which leads to the ill-formed expression for
T::b itself, e.g. B&, B*, int - gcc compiles without errors:

struct B {
    const bool b = true;
};

template <typename T>
concept C = T::b;

static_assert( !C<B*> );
static_assert( !C<B&> );
static_assert( !C<int> );

https://gcc.godbolt.org/z/9c6YW1vWe

I would expect (at least as a user) the same behaviour for static_assert(!C<B>)
too, in that case.

So gcc seems to consider T::b (with T=b) in this context as a well-formed
expression, but not a constant expression.

Looks strange.

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

end of thread, other threads:[~2023-07-02  8:08 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-30  9:23 [Bug c++/110497] New: Wrong error on non-static data member referenced in concept definition fchelnokov at gmail dot com
2023-06-30  9:41 ` [Bug c++/110497] " redi at gcc dot gnu.org
2023-06-30 13:44 ` ppalka at gcc dot gnu.org
2023-07-02  8:08 ` daniel-dev at hotmail dot de

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).