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;
      |                         ^~~~~~~~~~~~~

Reply via email to