When I try to compile following code, I get error: test1.cpp: In instantiation of 'void xx(T*, A ...) [with X = int (Funny::*)(int) const; X ff = &Funny::print3; R = int; T = Funny; A = {int}]': test1.cpp:35:74: required from here test1.cpp:23:9: internal compiler error: in finish_decltype_type, at cp/semantics.c:5244 code: #include <iostream> struct Funny { void print(int i) { std::cout << "void (Funny::*)(int): " << i << std::endl; } int print2(int i) { std::cout << "int (Funny::*)(int): " << i << std::endl; return i; } int print3(int i) const { std::cout << "int (Funny::*)(int) const: " << i << std::endl; return i; } }; template<typename T, typename X, X ff> void c(){ T abc; (abc.*ff)(123); } template<typename X, X ff, typename R, typename T, typename... A > void xx(T* _obj, A... args){ for (int i : {2,4}) std::cout << i << std::endl; // #3 int i is OK { /* 23 */ c<T, decltype(ff), ff>(); // #1 summary error trigger here } std::cout << "xx()" << std::endl; (_obj->*(ff))(args...); // #2 can not define any object here, even int // T abc; //(abc.*ff)(args...); } int main() { Funny abc; /* 35 */ xx<int (Funny::*)(int)const, &Funny::print3, int, Funny, int>(&abc, 3); return 0; } configured with: C:\test>g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/i686-pc-mingw32/4.7.0/lto-wrappe r.exe Target: i686-pc-mingw32 Configured with: ../../mingw-src/gcc-trunk/configure --host=i686-pc-mingw32 --bu ild=i686-pc-mingw32 --target=i686-pc-mingw32 --prefix=/mingw-sjlj-x86 --with-arc h=i686 --with-tune=generic --enable-languages=c,c++,lto,fortran,objc,obj-c++ --w ith-host-libstdcxx=-lstdc++ --disable-shared --enable-static --enable-cxx-flags= '-fno-function-sections -fno-data-sections' --enable-libstdcxx-time=yes --enable -libgomp --enable-lto --enable-graphite --enable-cloog-backend=isl --enable-chec king=release --enable-fully-dynamic-string --enable-threads=posix --disable-libs tdcxx-pch --enable-libstdcxx-debug --enable-sjlj-exceptions --disable-debug --di sable-bootstrap --disable-multilib --disable-rpath --disable-win32-registry --di sable-nls --disable-werror --disable-symvers --with-gmp=/mingw-libs --with-mpfr= /mingw-libs --with-mpc=/mingw-libs --with-ppl=/mingw-libs --with-cloog=/mingw-li bs --with-libiconv-prefix=/mingw-libs --with-pkgversion='niXman build' Thread model: posix
Can be reduced to this, and seems a Regression: struct Funny { int print3(int) const; }; template<typename X, X ff> void c(); template<typename X, X ff, typename R, typename... A> void xx(A... args) { c<decltype(ff), ff>(); } int main() { xx<int (Funny::*)(int) const, &Funny::print3, int, int>(3); }
On it. A tad simpler: struct Funny { int print(int); }; template<typename X, X ff> void c(); template<typename X, X ff> void xx() { c<decltype(ff), ff>(); } int main() { xx<int (Funny::*)(int), &Funny::print>(); }
Even: struct Funny; template<typename X> void c(); template<typename X> void xx() { c<decltype(ff)>(); } int main() { xx<int(Funny::*)(int)>(); }
oops, scratch the latter ;)
Author: paolo Date: Tue Nov 22 20:48:33 2011 New Revision: 181638 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=181638 Log: /cp 2011-11-22 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51265 * semantics.c (finish_decltype_type): Handle PTRMEM_CST. /testsuite 2011-11-22 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51265 * g++.dg/cpp0x/decltype36.C: New. Added: trunk/gcc/testsuite/g++.dg/cpp0x/decltype36.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/semantics.c trunk/gcc/testsuite/ChangeLog
Author: paolo Date: Tue Nov 22 21:37:24 2011 New Revision: 181641 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=181641 Log: /cp 2011-11-22 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51265 * semantics.c (finish_decltype_type): Handle PTRMEM_CST. /testsuite 2011-11-22 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51265 * g++.dg/cpp0x/decltype36.C: New. Added: branches/gcc-4_6-branch/gcc/testsuite/g++.dg/cpp0x/decltype36.C Modified: branches/gcc-4_6-branch/gcc/cp/ChangeLog branches/gcc-4_6-branch/gcc/cp/semantics.c branches/gcc-4_6-branch/gcc/testsuite/ChangeLog
Fixed for 4.6.3 and mainline.