https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100687
Bug ID: 100687
Summary: [modules, concepts] imported concept gives different
result
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: webrown.cpp at gmail dot com
Target Milestone: ---
Using recent trunk [g++-HEAD (Homebrew GCC HEAD-5380e3c) 12.0.0 20210513],
compiling with significant flags -std=c++23 -fmodules-ts -c.
I have two source files, as follows:
//////////////////////
export module bug_a;
template< class T >
inline constexpr bool probe = false;
//
template< class R, class C >
inline constexpr bool probe<R C::* > = true;
export
template< class T >
concept mbr_ptr = probe<T>;
struct S { int f( ); };
using mf_t = decltype( &S::f );
static_assert( mbr_ptr< mf_t > );
//////////////////////
This bug_a module compiles successfully. In particular, the static_assert
passes.
//////////////////////
export module bug_b;
import bug_a;
struct S { int f( ); };
using mf_t = decltype( &S::f );
static_assert( mbr_ptr< mf_t > );
//////////////////////
This bug_b module does not compile. The diagnostics are reproduced below,
including the somewhat mysterious lone apostrophe:
bug_b.cc:8:16: error: static assertion failed
8 | static_assert( mbr_ptr< mf_t > );
| ^~~~~~~~~~~~~~~
bug_b.cc:8:16: note: constraints not satisfied
'
bug_a.cc:12: confused by earlier errors, bailing out
Please note that the static_assert and supporting declarations in module bug_a
are identical to those in module bug_a, yet one compiles while the other does
not.
Thus we seem to have two problems: (1) the lone apostrophe amongst the
diagnostics, and (2) the inconsistent evaluation of identical expressions.
Finally, please note that if I use a class template (instead of the variable
template) in module bug_a, both modules' static_asserts now compile without
complaint:
//////////////////////
template< class T >
struct probe { static constexpr bool value = false; };
//
template< class R, class C >
struct probe<R C::*> { static constexpr bool value = true; };
export
template< class T >
concept
mbr_ptr = probe<T>::value;
//////////////////////