https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96410
Bug ID: 96410 Summary: A lambda with a template parameter list using C++20 requires clauses is not usable in a constant expression Product: gcc Version: 10.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: hewillk at gmail dot com Target Milestone: --- Created attachment 48980 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48980&action=edit the preprocessed file The following code: #include <concepts> template <typename T> void f(T t) { auto g = []<typename U>(U u) { if constexpr (requires { std::integral<U>; }); }; g(t); } int main() { f(1); } will occurs compile error: <source>: In instantiation of 'void f(T) [with T = int]': <source>:13:6: required from here /opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/concepts:102:13: required by the constraints of 'template<class _Tp> concept std::integral' /opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/concepts:102:24: error: the value of 'std::is_integral_v<U>' is not usable in a constant expression 102 | concept integral = is_integral_v<_Tp>; | ^~~~~~~~~~~~~~~~~~ In file included from /opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/concepts:44, from <source>:1: /opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/type_traits:3031:25: note: 'std::is_integral_v<U>' used in its own initializer 3031 | inline constexpr bool is_integral_v = is_integral<_Tp>::value; | ^~~~~~~~~~~~~ ASM generation compiler returned: 1 This seems weird since the type U can be deduced in the compiler time. command line: $ gcc -v -save-temps -std=c++20 main.cpp Using built-in specs. COLLECT_GCC=/usr/local/bin/gcc-10 COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/10.1.0/libexec/gcc/x86_64-apple-darwin17/10.1.0/lto-wrapper Target: x86_64-apple-darwin17 Configured with: ../configure --build=x86_64-apple-darwin17 --prefix=/usr/local/Cellar/gcc/10.1.0 --libdir=/usr/local/Cellar/gcc/10.1.0/lib/gcc/10 --disable-nls --enable-checking=release --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-10 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --with-pkgversion='Homebrew GCC 10.1.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --disable-multilib SED=/usr/bin/sed Thread model: posix Supported LTO compression algorithms: zlib gcc version 10.1.0 (Homebrew GCC 10.1.0) COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++2a' '-mmacosx-version-min=10.13.0' '-asm_macosx_version_min=10.13' '-mtune=core2' /usr/local/Cellar/gcc/10.1.0/libexec/gcc/x86_64-apple-darwin17/10.1.0/cc1plus -E -quiet -v -D__DYNAMIC__ main.cpp -fPIC -mmacosx-version-min=10.13.0 -mtune=core2 -std=c++2a -fpch-preprocess -o main.ii ignoring duplicate directory "/usr/local/include" ignoring nonexistent directory "/usr/local/Cellar/gcc/10.1.0/lib/gcc/10/gcc/x86_64-apple-darwin17/10.1.0/../../../../../../x86_64-apple-darwin17/include" #include "..." search starts here: #include <...> search starts here: . /usr/local/include /usr/local/Cellar/gcc/10.1.0/lib/gcc/10/gcc/x86_64-apple-darwin17/10.1.0/../../../../../../include/c++/10.1.0 /usr/local/Cellar/gcc/10.1.0/lib/gcc/10/gcc/x86_64-apple-darwin17/10.1.0/../../../../../../include/c++/10.1.0/x86_64-apple-darwin17 /usr/local/Cellar/gcc/10.1.0/lib/gcc/10/gcc/x86_64-apple-darwin17/10.1.0/../../../../../../include/c++/10.1.0/backward /usr/local/Cellar/gcc/10.1.0/lib/gcc/10/gcc/x86_64-apple-darwin17/10.1.0/include /usr/local/Cellar/gcc/10.1.0/include /usr/local/Cellar/gcc/10.1.0/lib/gcc/10/gcc/x86_64-apple-darwin17/10.1.0/include-fixed /usr/include /System/Library/Frameworks /Library/Frameworks End of search list. COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++2a' '-mmacosx-version-min=10.13.0' '-asm_macosx_version_min=10.13' '-mtune=core2' /usr/local/Cellar/gcc/10.1.0/libexec/gcc/x86_64-apple-darwin17/10.1.0/cc1plus -fpreprocessed main.ii -fPIC -quiet -dumpbase main.cpp -mmacosx-version-min=10.13.0 -mtune=core2 -auxbase main -std=c++2a -version -o main.s GNU C++17 (Homebrew GCC 10.1.0) version 10.1.0 (x86_64-apple-darwin17) compiled by GNU C version 10.1.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 GNU C++17 (Homebrew GCC 10.1.0) version 10.1.0 (x86_64-apple-darwin17) compiled by GNU C version 10.1.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: b1074358e29f54f1a357a06623845700 In file included from main.cpp:1: main.cpp: In instantiation of 'void f(T) [with T = int]': main.cpp:13:6: required from here /usr/local/Cellar/gcc/10.1.0/include/c++/10.1.0/concepts:102:13: required by the constraints of 'template<class _Tp> concept std::integral' /usr/local/Cellar/gcc/10.1.0/include/c++/10.1.0/concepts:102:24: error: the value of 'std::is_integral_v<U>' is not usable in a constant expression 102 | concept integral = is_integral_v<_Tp>; | ^~~~~~~~~~~~~~~~~~ In file included from /usr/local/Cellar/gcc/10.1.0/include/c++/10.1.0/concepts:44, from main.cpp:1: /usr/local/Cellar/gcc/10.1.0/include/c++/10.1.0/type_traits:3031:25: note: 'std::is_integral_v<U>' used in its own initializer 3031 | inline constexpr bool is_integral_v = is_integral<_Tp>::value; | ^~~~~~~~~~~~~