http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49156
--- Comment #1 from froydnj at codesourcery dot com <froydnj at codesourcery dot com> 2011-05-25 19:36:46 UTC --- On 05/25/2011 05:14 AM, redi at gcc dot gnu.org wrote: > template<typename T> T declval(); > > template<typename T> > struct S { > > template<typename U> > static U get(const volatile T&); > > template<typename U> > static decltype(*declval<U>()) get(...); > > typedef decltype(get<T>(declval<T>())) type; > }; > > struct X { }; > > S<X>::type x; > > err.cc: In instantiation of ‘S<X>’: > err.cc:17:5: instantiated from here > err.cc:12:42: error: no matching function for call to ‘S<X>::get(X)’ > err.cc:12:42: note: candidates are: > err.cc:7:35: note: template<class U> static U S::get(const volatile T&) [with > U > = U, T = X] > > Internal compiler error: Error reporting routines re-entered. The backtrace for this is just lovely: #2 0x00000000038bc424 in error_recursion (context=0x4f4fc00) at /home/froydnj/src/combined-tree/gcc/diagnostic.c:879 #3 0x00000000038baece in diagnostic_report_diagnostic (context=0x4f4fc00, diagnostic=0x7fffffff5120) at /home/froydnj/src/combined-tree/gcc/diagnostic.c:432 #4 0x00000000038bb67e in emit_diagnostic (kind=DK_ERROR, location=1524, opt=0, gmsgid=0x395a198 "invalid use of template type parameter %qT") at /home/froydnj/src/combined-tree/gcc/diagnostic.c:628 #5 0x000000000065c30a in cxx_incomplete_type_diagnostic (value=0x7ffff7ff81f8, type=0x7ffff777ad20, diag_kind=DK_ERROR) at /home/froydnj/src/combined-tree/gcc/cp/typeck2.c:437 #6 0x00000000007fbe8b in complete_type_or_maybe_complain (type=0x7ffff777ad20, value=0x7ffff7ff81f8, complain=3) at /home/froydnj/src/combined-tree/gcc/cp/typeck.c:153 #7 0x00000000007fb7b5 in require_complete_type_sfinae (value=0x7ffff7ff81f8, complain=3) at /home/froydnj/src/combined-tree/gcc/cp/typeck.c:90 #8 0x00000000007fb7e6 in require_complete_type (value=0x7ffff7ff81f8) at /home/froydnj/src/combined-tree/gcc/cp/typeck.c:99 #9 0x00000000004e88f2 in build_cxx_call (fn=0x7ffff7ff81f8, nargs=0, argarray=0x7fffffff54c0) at /home/froydnj/src/combined-tree/gcc/cp/call.c:6686 #10 0x00000000004e86ba in build_over_call (cand=0x4fe2ee0, flags=524291, complain=0) at /home/froydnj/src/combined-tree/gcc/cp/call.c:6650 #11 0x00000000004d7d35 in build_new_function_call (fn=0x7ffff7ecbf30, args=0x7fffffff6168, koenig_p=0 '\000', complain=0) at /home/froydnj/src/combined-tree/gcc/cp/call.c:3789 #12 0x0000000000946bc1 in finish_call_expr (fn=0x7ffff7ecbf30, args=0x7fffffff6168, disallow_virtual=0 '\000', koenig_p=0 '\000', complain=0) at /home/froydnj/src/combined-tree/gcc/cp/semantics.c:2152 #13 0x000000000061148e in tsubst_copy_and_build (t=0x7ffff7ff80a8, args=0x7ffff7ecbd80, complain=0, in_decl=0x0, function_p=0 '\000', integral_constant_expression_p=0 '\000') at /home/froydnj/src/combined-tree/gcc/cp/pt.c:13076 #14 0x000000000060d0ae in tsubst_copy_and_build (t=0x7ffff777b028, args=0x7ffff7ecbd80, complain=0, in_decl=0x0, function_p=0 '\000', integral_constant_expression_p=0 '\000') at /home/froydnj/src/combined-tree/gcc/cp/pt.c:12597 #15 0x000000000060c7cf in tsubst_expr (t=0x7ffff777b028, args=0x7ffff7ecbd80, complain=0, in_decl=0x0, integral_constant_expression_p=0 '\000') at /home/froydnj/src/combined-tree/gcc/cp/pt.c:12477 #16 0x00000000005fa410 in tsubst (t=0x7ffff777a150, args=0x7ffff7ecbd80, complain=0, in_decl=0x0) at /home/froydnj/src/combined-tree/gcc/cp/pt.c:11044 #17 0x000000000072893f in dump_template_bindings (parms=0x0, args=0x7ffff7ecbd80, typenames=0x7ffff777bc80) at /home/froydnj/src/combined-tree/gcc/cp/error.c:317 #18 0x00000000007337b4 in dump_function_decl (t=0x7ffff7779730, flags=388) at /home/froydnj/src/combined-tree/gcc/cp/error.c:1384 #19 0x0000000000730d16 in dump_template_decl (t=0x7ffff777d0b8, flags=132) at /home/froydnj/src/combined-tree/gcc/cp/error.c:1207 #20 0x000000000072f9c9 in dump_decl (t=0x7ffff777d0b8, flags=132) at /home/froydnj/src/combined-tree/gcc/cp/error.c:1068 #21 0x000000000073dd19 in decl_to_string (decl=0x7ffff777d0b8, verbose=1) at /home/froydnj/src/combined-tree/gcc/cp/error.c:2541 #22 0x0000000000740892 in cp_printer (pp=0x4f6b5a0, text=0x7fffffff98a0, spec=0x4f503e1 "D", precision=0, wide=0 '\000', set_locus=0 '\000', verbose=1 '\001') at /home/froydnj/src/combined-tree/gcc/cp/error.c:3079 #23 0x00000000038be660 in pp_base_format (pp=0x4f6b5a0, text=0x7fffffff98a0) at /home/froydnj/src/combined-tree/gcc/pretty-print.c:508 #24 0x00000000038bb26c in diagnostic_report_diagnostic (context=0x4f4fc00, diagnostic=0x7fffffff98a0) at /home/froydnj/src/combined-tree/gcc/diagnostic.c:541 #25 0x00000000038bb777 in inform (location=1269, gmsgid=0x3948956 "%s%#D") at /home/froydnj/src/combined-tree/gcc/diagnostic.c:641 #26 0x00000000004d4a50 in print_z_candidate (msgstr=0x0, candidate=0x4fe2e00) at /home/froydnj/src/combined-tree/gcc/cp/call.c:3133 #27 0x00000000004d4d71 in print_z_candidates (loc=1524, candidates=0x4fe2e00) at /home/froydnj/src/combined-tree/gcc/cp/call.c:3214 It looks like we're building a separate DECL to print it and we need a complete type along the way, but creating the complete type causes problems and we fall over.