http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47022
--- Comment #2 from Yu Simin <silver24k at gmail dot com> 2010-12-28 02:45:16 UTC --- I found this code ICEs: #include <stdarg.h> template<typename _T> void foo(_T *p, va_list argptr) { *p = va_arg(argptr, long double); //float/double } void bar(va_list ap) { long double argdata = 0; foo<long double>(&argdata, ap); } Changing long double to double or float also causes the ICE but this is OK: #include <stdarg.h> template<typename _T> void foo(_T *p, va_list argptr) { *p = va_arg(argptr, _T); } void bar(va_list ap) { long double argdata = 0; foo<long double>(&argdata, ap); }