GCC ICE(段错误)和 clang 编译得很好:这是有效的代码吗?

sky*_*ack 5 c++ templates g++ clang language-lawyer

考虑以下片段:

template<typename...>
struct S;

template<typename R, typename... A, typename... T>
struct S<R(A...), T...> {
    template<R(T::* ...M)(A...)>
    void f() {}
};

struct A { void f() {} };
struct B { void f() {} };

int main() {
    S<void(void), A, B> s;
    s.f<&A::f, &B::f>();
}
Run Code Online (Sandbox Code Playgroud)

Clang (3.9) 编译它没有错误。
GCC (6.2) 有一个 ICE (实际上是一个segfault):

/data/user/0/com.n0n3m4.droidc/files/temp.c: In function 'int main()':
/data/user/0/com.n0n3m4.droidc/files/temp.c:20:23: internal compiler error: Segmentation fault
     s.f<&A::f, &B::f>();
                ^
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
Run Code Online (Sandbox Code Playgroud)

除了由于 segfault 我已经向 GCC 提出问题之外上面的代码是否有效?
换句话说,clang 是否正确接受它,还是应该被两个编译器拒绝?


是向 GCC 提出的问题。