https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109084
Bug ID: 109084 Summary: requires keyword can't access private static constexpr bool in templated class Product: gcc Version: 12.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: brignon.enzo at protonmail dot com Target Milestone: --- Created attachment 54626 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54626&action=edit The minimal reproduction file (not preprocessed because it does not include anything) When using requires keyword to enable class member function using a private static constexpr bool (eventually the value of a concept) in a templated class gcc fails to access the given boolean variable because it is private within its context. It does not fail if the boolean is public or if the class is not templated. You can find a minimal example (not preprocessed because it needs no include) in attachment. Output of gcc -v: Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.1/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: /build/gcc/src/gcc/configure --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 12.2.1 20230201 (GCC) The file is complied with following options: g++ -std=c++20 bug.cpp Output of gcc: bug.cpp: In function 'int main()': bug.cpp:12:15: error: class template argument deduction failed: 12 | MyClass c{}; | ^ bug.cpp:12:15: error: no matching function for call to 'MyClass()' bug.cpp:8:5: note: candidate: 'template<class T, class Enable> requires MyClass<T>::cond MyClass()-> MyClass<T>' 8 | MyClass() {} | ^~~~~~~ bug.cpp:8:5: note: template argument deduction/substitution failed: bug.cpp:8:5: note: constraints not satisfied bug.cpp: In substitution of 'template<class T, class Enable> requires MyClass<T>::cond MyClass()-> MyClass<T> [with T = int; Enable = void]': bug.cpp:12:15: required from here bug.cpp:8:5: required by the constraints of 'template<class T, class Enable> requires MyClass<T>::cond MyClass()-> MyClass<T>' bug.cpp:12:15: error: 'constexpr const bool MyClass<int>::cond' is private within this context 12 | MyClass c{}; | ^ bug.cpp:5:27: note: declared private here 5 | static constexpr bool cond = true; | ^~~~ bug.cpp:3:7: note: candidate: 'template<class T> MyClass(MyClass<T>)-> MyClass<T>' 3 | class MyClass { | ^~~~~~~ bug.cpp:3:7: note: template argument deduction/substitution failed: bug.cpp:12:15: note: candidate expects 1 argument, 0 provided 12 | MyClass c{}; |