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

            Bug ID: 79381
           Summary: [concepts] Call to template function with
                    type-requirement unsatisfied not rejected
           Product: gcc
           Version: 7.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: d25fe0be at yandex dot com
  Target Milestone: ---

$ cat t.cpp 
template <class T> struct DeriveFrom : T {};
template <class T> concept bool Derivable = requires { typename DeriveFrom<T>;
};

void foo() {};
void TryDerivable(Derivable) {}

int main() {
        TryDerivable(foo);
}

$ g++-7 ./t.cpp -fconcepts -Wall -Wextra
$

As stated in n4377/5.1.4.2 (expr.prim.req.type):

[quote] A type requirement asserts the validity of ... a class template
specialization ... [/quote]

Specializing 'DeriveFrom' with 'decltype(foo)' results in deriving from some
function pointer type, which is ill-formed. So 'foo' does not satisfy the
'Derivable' constraint. And the compilation should fail.

$ g++-7 -v
Using built-in specs.
COLLECT_GCC=g++-7
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/HEAD-245030_1/libexec/gcc/x86_64-apple-darwin16.3.0/7.0.1/lto-wrapper
Target: x86_64-apple-darwin16.3.0
Configured with: ../configure --build=x86_64-apple-darwin16.3.0
--prefix=/usr/local/Cellar/gcc/HEAD-245030_1
--libdir=/usr/local/Cellar/gcc/HEAD-245030_1/lib/gcc/7
--enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-7
--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 --enable-stage1-checking --enable-checking=release
--enable-lto --with-build-config=bootstrap-debug --disable-werror
--with-pkgversion='Homebrew GCC HEAD-245030_1'
--with-bugurl=https://github.com/Homebrew/homebrew-core/issues
--enable-multilib
Thread model: posix
gcc version 7.0.1 20170130 (experimental) (Homebrew GCC HEAD-245030_1s)

Reply via email to