public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) @ 2020-03-25 13:09 marxin at gcc dot gnu.org 2020-03-25 13:09 ` [Bug debug/94326] " marxin at gcc dot gnu.org ` (7 more replies) 0 siblings, 8 replies; 9+ messages in thread From: marxin at gcc dot gnu.org @ 2020-03-25 13:09 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94326 Bug ID: 94326 Summary: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: debug Assignee: unassigned at gcc dot gnu.org Reporter: marxin at gcc dot gnu.org CC: jakub at gcc dot gnu.org Target Milestone: --- This one is very old (at least GCC 4.8.0): $ cat pack.ii template <typename = int> class A { const int &m_fn1() { return 0; } public: template <typename _Kt> void m_fn2(_Kt) { m_fn1(); } }; class B { A<> _M_t; public: template <typename _Kt> auto m_fn3(_Kt p1) -> decltype(_M_t.m_fn2(p1)) { _M_t.m_fn2(p1); } }; struct C {}; void operator<(C, int) { B a; a.m_fn3(C{}); } $ g++ pack.ii -c -fcompare-debug -std=c++11 pack.ii: In instantiation of ‘const int& A< <template-parameter-1-1> >::m_fn1() [with <template-parameter-1-1> = int]’: pack.ii:5:45: required from ‘void A< <template-parameter-1-1> >::m_fn2(_Kt) [with _Kt = C; <template-parameter-1-1> = int]’ pack.ii:12:15: required from ‘decltype (((B*)this)->B::_M_t.A<>::m_fn2<_Kt>(p1)) B::m_fn3(_Kt) [with _Kt = C; decltype (((B*)this)->B::_M_t.A<>::m_fn2<_Kt>(p1)) = void]’ pack.ii:18:14: required from here pack.ii:2:31: warning: returning reference to temporary [-Wreturn-local-addr] 2 | const int &m_fn1() { return 0; } | ^ g++: error: pack.ii: ‘-fcompare-debug’ failure (length) ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug debug/94326] g++: error: pack.ii: ‘-fcompare-debug’ failure (length) 2020-03-25 13:09 [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) marxin at gcc dot gnu.org @ 2020-03-25 13:09 ` marxin at gcc dot gnu.org 2020-03-25 15:27 ` marxin at gcc dot gnu.org ` (6 subsequent siblings) 7 siblings, 0 replies; 9+ messages in thread From: marxin at gcc dot gnu.org @ 2020-03-25 13:09 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94326 Martin Liška <marxin at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Priority|P3 |P2 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug debug/94326] g++: error: pack.ii: ‘-fcompare-debug’ failure (length) 2020-03-25 13:09 [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) marxin at gcc dot gnu.org 2020-03-25 13:09 ` [Bug debug/94326] " marxin at gcc dot gnu.org @ 2020-03-25 15:27 ` marxin at gcc dot gnu.org 2020-03-26 12:30 ` [Bug c++/94326] " jakub at gcc dot gnu.org ` (5 subsequent siblings) 7 siblings, 0 replies; 9+ messages in thread From: marxin at gcc dot gnu.org @ 2020-03-25 15:27 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94326 Martin Liška <marxin at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Last reconfirmed| |2020-03-25 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug c++/94326] g++: error: pack.ii: ‘-fcompare-debug’ failure (length) 2020-03-25 13:09 [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) marxin at gcc dot gnu.org 2020-03-25 13:09 ` [Bug debug/94326] " marxin at gcc dot gnu.org 2020-03-25 15:27 ` marxin at gcc dot gnu.org @ 2020-03-26 12:30 ` jakub at gcc dot gnu.org 2020-03-26 12:31 ` jakub at gcc dot gnu.org ` (4 subsequent siblings) 7 siblings, 0 replies; 9+ messages in thread From: jakub at gcc dot gnu.org @ 2020-03-26 12:30 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94326 Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Component|debug |c++ --- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Indeed, I think this started failing with r0-114389-g4b6aaa996e0d8f5abac818315b6f77cb3596db98 before which it has been rejected with sorry message. The bug isn't debug related in this case, but -w is affecting generated code. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug c++/94326] g++: error: pack.ii: ‘-fcompare-debug’ failure (length) 2020-03-25 13:09 [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) marxin at gcc dot gnu.org ` (2 preceding siblings ...) 2020-03-26 12:30 ` [Bug c++/94326] " jakub at gcc dot gnu.org @ 2020-03-26 12:31 ` jakub at gcc dot gnu.org 2020-03-26 13:58 ` jakub at gcc dot gnu.org ` (3 subsequent siblings) 7 siblings, 0 replies; 9+ messages in thread From: jakub at gcc dot gnu.org @ 2020-03-26 12:31 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94326 --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- $ rm -f pr94326.C.*; ./cc1plus -quiet -std=c++11 pr94326.C -Wreturn-local-addr -da; grep REG_EH_REGION pr94326.C.* pr94326.C: In instantiation of ‘const int& A< <template-parameter-1-1> >::m_fn1() [with <template-parameter-1-1> = int]’: pr94326.C:5:45: required from ‘void A< <template-parameter-1-1> >::m_fn2(_Kt) [with _Kt = C; <template-parameter-1-1> = int]’ pr94326.C:12:15: required from ‘decltype (((B*)this)->B::_M_t.A<>::m_fn2<_Kt>(p1)) B::m_fn3(_Kt) [with _Kt = C; decltype (((B*)this)->B::_M_t.A<>::m_fn2<_Kt>(p1)) = void]’ pr94326.C:18:14: required from here pr94326.C:2:31: warning: returning reference to temporary [-Wreturn-local-addr] 2 | const int &m_fn1() { return 0; } | ^ $ rm -f pr94326.C.*; ./cc1plus -quiet -std=c++11 pr94326.C -Wno-return-local-addr -da; grep REG_EH_REGION pr94326.C.* pr94326.C.236r.expand: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.236r.expand: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.237r.vregs: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.238r.into_cfglayout: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.239r.jump: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.239r.jump: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.251r.reginfo: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.274r.outof_cfglayout: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.275r.split1: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.277r.dfinit: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.278r.mode_sw: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.279r.asmcons: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.284r.ira: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.285r.reload: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.292r.pro_and_epilogue: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.295r.jump2: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.306r.split4: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.307r.stack: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.308r.alignments: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.310r.mach: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.311r.barriers: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.316r.shorten: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.317r.nothrow: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.318r.dwarf2: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.319r.final: (expr_list:REG_EH_REGION (const_int 0 [0]) pr94326.C.320r.dfinish: (expr_list:REG_EH_REGION (const_int 0 [0]) ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug c++/94326] g++: error: pack.ii: ‘-fcompare-debug’ failure (length) 2020-03-25 13:09 [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) marxin at gcc dot gnu.org ` (3 preceding siblings ...) 2020-03-26 12:31 ` jakub at gcc dot gnu.org @ 2020-03-26 13:58 ` jakub at gcc dot gnu.org 2020-03-26 14:05 ` jakub at gcc dot gnu.org ` (2 subsequent siblings) 7 siblings, 0 replies; 9+ messages in thread From: jakub at gcc dot gnu.org @ 2020-03-26 13:58 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94326 Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jason at gcc dot gnu.org --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- And the reason for the differences is that with -Wno-return-local-addr (or -w etc.) m_fn1 is marked TREE_NOTHROW (fndecl) in finish_function, while with -Wreturn-local-addr (and without -w) it is not. The difference is in cp_function_chain->can_throw , which set not set in the no warning case, and is set in: #0 set_flags_from_callee (call=<call_expr 0x7fffea958580>) at ../../gcc/cp/call.c:324 #1 0x0000000000966d3b in build_call_a (function=<call_expr 0x7fffea958580>, n=2, argarray=0x7fffffffb1e0) at ../../gcc/cp/call.c:365 #2 0x000000000098936f in build_cxx_call (fn=<addr_expr 0x7fffea956f60>, nargs=2, argarray=0x7fffffffb1e0, complain=128, orig_fndecl=<tree 0x0>) at ../../gcc/cp/call.c:9578 #3 0x00000000009877cc in build_over_call (cand=0x3763930, flags=3, complain=0) at ../../gcc/cp/call.c:9082 #4 0x000000000098c868 in build_new_method_call_1 (instance=<component_ref 0x7fffea949b70>, fns=<overload 0x7fffea936c20>, args=0x7fffffffb860 = {...}, conversion_path=<tree_binfo 0x7fffea93e5a0>, flags=1, fn_p=0x0, complain=128) at ../../gcc/cp/call.c:10335 #5 0x000000000098cd56 in build_new_method_call (instance=<component_ref 0x7fffea949b70>, fns=<baselink 0x7fffea949ba0>, args=0x7fffffffb860 = {...}, conversion_path=<tree 0x0>, flags=1, fn_p=0x0, complain=128) at ../../gcc/cp/call.c:10410 #6 0x0000000000c41d6f in tsubst_copy_and_build (t=<call_expr 0x7fffea801188>, args=<tree_vec 0x7fffea956360>, complain=128, in_decl=<tree 0x0>, function_p=false, integral_constant_expression_p=false) at ../../gcc/cp/pt.c:19812 #7 0x0000000000c2ae69 in tsubst (t=<decltype_type 0x7fffea94f1f8>, args=<tree_vec 0x7fffea956360>, complain=0, in_decl=<tree 0x0>) at ../../gcc/cp/pt.c:15746 #8 0x0000000000ac831c in dump_template_bindings (pp=0x34be940 <actual_pretty_printer>, parms=<tree 0x0>, args=<tree_vec 0x7fffea956360>, typenames=0x7fffea950a28 = {...}) at ../../gcc/cp/error.c:414 #9 0x0000000000ace590 in dump_substitution (pp=0x34be940 <actual_pretty_printer>, t=<template_decl 0x7fffea81e980 m_fn3>, template_parms=<tree_list 0x7fffea935e38>, template_args=<tree_vec 0x7fffea956360>, flags=132) at ../../gcc/cp/error.c:1560 #10 0x0000000000ad0138 in dump_function_decl (pp=0x34be940 <actual_pretty_printer>, t=<template_decl 0x7fffea81e980 m_fn3>, flags=132) at ../../gcc/cp/error.c:1718 #11 0x0000000000acd485 in dump_decl (pp=0x34be940 <actual_pretty_printer>, t=<function_decl 0x7fffea95a700 m_fn3>, flags=132) at ../../gcc/cp/error.c:1290 #12 0x0000000000ad6ba8 in decl_to_string (decl=<function_decl 0x7fffea95a700 m_fn3>, verbose=1) at ../../gcc/cp/error.c:3092 #13 0x0000000000ada974 in cp_printer (pp=0x370bbb0, text=0x7fffffffc550, spec=0x3721f62 "D", precision=0, wide=false, set_locus=false, verbose=true, quoted=0x7fffffffc19f, buffer_ptr=0x3721d70) at ../../gcc/cp/error.c:4260 #14 0x00000000026f5fe2 in pp_format (pp=0x370bbb0, text=0x7fffffffc550) at ../../gcc/pretty-print.c:1458 #15 0x00000000026f63b2 in pp_format_verbatim (pp=0x370bbb0, text=0x7fffffffc550) at ../../gcc/pretty-print.c:1519 #16 0x00000000026f6c1d in pp_verbatim (pp=0x370bbb0, msg=0x2813680 "required from %q#D\n") at ../../gcc/pretty-print.c:1773 #17 0x0000000000ad8b73 in print_instantiation_partial_context_line (context=0x36bc320 <global_diagnostic_context>, t=0x7fffea956440, loc=2147483653, recursive_p=false) at ../../gcc/cp/error.c:3537 #18 0x0000000000ad8e6d in print_instantiation_partial_context (context=0x36bc320 <global_diagnostic_context>, t0=0x7fffea936860, loc=2147483653) at ../../gcc/cp/error.c:3625 #19 0x0000000000ad89fb in print_instantiation_full_context (context=0x36bc320 <global_diagnostic_context>) at ../../gcc/cp/error.c:3505 #20 0x0000000000ad8eec in maybe_print_instantiation_context (context=0x36bc320 <global_diagnostic_context>) at ../../gcc/cp/error.c:3642 #21 0x0000000000ad74c6 in cp_diagnostic_starter (context=0x36bc320 <global_diagnostic_context>, diagnostic=0x7fffffffc880) at ../../gcc/cp/error.c:3341 #22 0x00000000026cfced in diagnostic_report_diagnostic (context=0x36bc320 <global_diagnostic_context>, diagnostic=0x7fffffffc880) at ../../gcc/diagnostic.c:1160 #23 0x00000000026d02f2 in diagnostic_impl (richloc=0x7fffffffc8f0, metadata=0x0, opt=635, gmsgid=0x284c5f8 "returning reference to temporary", ap=0x7fffffffc9a0, kind=DK_WARNING) at ../../gcc/diagnostic.c:1309 #24 0x00000000026d0b70 in warning_at (location=247168, opt=635, gmsgid=0x284c5f8 "returning reference to temporary") i.e. when the warning is being emitted. The call in question is A<>::m_fn2<C> (&((struct B *) this)->_M_t, TARGET_EXPR <D.2226, p1> So, shall set_flags_from_callee be setting cp_function_chain->can_throw (or other flags) even in cp_unevaluated_operand ? Or shouldn't tsubst or whatever else sets cp_unevaluated_operand? Something else? ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug c++/94326] g++: error: pack.ii: ‘-fcompare-debug’ failure (length) 2020-03-25 13:09 [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) marxin at gcc dot gnu.org ` (4 preceding siblings ...) 2020-03-26 13:58 ` jakub at gcc dot gnu.org @ 2020-03-26 14:05 ` jakub at gcc dot gnu.org 2020-03-27 9:05 ` cvs-commit at gcc dot gnu.org 2020-03-27 20:19 ` jakub at gcc dot gnu.org 7 siblings, 0 replies; 9+ messages in thread From: jakub at gcc dot gnu.org @ 2020-03-26 14:05 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94326 --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- --- gcc/cp/call.c.jj 2020-03-25 08:05:07.153731580 +0100 +++ gcc/cp/call.c 2020-03-26 15:03:42.432909693 +0100 @@ -333,11 +333,14 @@ set_flags_from_callee (tree call) && internal_fn_flags (CALL_EXPR_IFN (call)) & ECF_NOTHROW) nothrow = true; - if (!nothrow && at_function_scope_p () && cfun && cp_function_chain) - cp_function_chain->can_throw = 1; + if (cfun && cp_function_chain && !cp_unevaluated_operand) + { + if (!nothrow && at_function_scope_p ()) + cp_function_chain->can_throw = 1; - if (decl && TREE_THIS_VOLATILE (decl) && cfun && cp_function_chain) - current_function_returns_abnormally = 1; + if (decl && TREE_THIS_VOLATILE (decl)) + current_function_returns_abnormally = 1; + } TREE_NOTHROW (call) = nothrow; } seems to work, but not sure if that is what we want. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug c++/94326] g++: error: pack.ii: ‘-fcompare-debug’ failure (length) 2020-03-25 13:09 [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) marxin at gcc dot gnu.org ` (5 preceding siblings ...) 2020-03-26 14:05 ` jakub at gcc dot gnu.org @ 2020-03-27 9:05 ` cvs-commit at gcc dot gnu.org 2020-03-27 20:19 ` jakub at gcc dot gnu.org 7 siblings, 0 replies; 9+ messages in thread From: cvs-commit at gcc dot gnu.org @ 2020-03-27 9:05 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94326 --- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>: https://gcc.gnu.org/g:2eea00c518d5a72d0bdbc810ae675e7ad5fee414 commit r10-7411-g2eea00c518d5a72d0bdbc810ae675e7ad5fee414 Author: Jakub Jelinek <jakub@redhat.com> Date: Fri Mar 27 10:04:31 2020 +0100 c++: Avoid calls in non-evaluated contexts affect whether function can or can't throw [PR94326] The following testcase FAILs -fcompare-debug, because if we emit a -Wreturn-local-addr warning, we tsubst decltype in order to print the warning and as that function could throw, set_flags_from_callee during that sets cp_function_chain->can_throw and later on we don't set TREE_NOTHROW on foo. While with -w or -Wno-return-local-addr, tsubst isn't called during the warning_at, cp_function_chain->can_throw is kept clear and TREE_NOTHROW is set on foo. It isn't just a matter of the warning though, in int foo (); int bar () { return sizeof (foo ()); } int baz () { return sizeof (int); } I don't really see why we should mark only baz as TREE_NOTHROW and not bar too, when neither can really throw. 2020-03-27 Jakub Jelinek <jakub@redhat.com> PR c++/94326 * call.c (set_flags_from_callee): Don't update cp_function_chain->can_throw or current_function_returns_abnormally if cp_unevaluated_operand. * g++.dg/other/pr94326.C: New test. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug c++/94326] g++: error: pack.ii: ‘-fcompare-debug’ failure (length) 2020-03-25 13:09 [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) marxin at gcc dot gnu.org ` (6 preceding siblings ...) 2020-03-27 9:05 ` cvs-commit at gcc dot gnu.org @ 2020-03-27 20:19 ` jakub at gcc dot gnu.org 7 siblings, 0 replies; 9+ messages in thread From: jakub at gcc dot gnu.org @ 2020-03-27 20:19 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94326 Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |FIXED Status|NEW |RESOLVED --- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Fixed for 10+. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2020-03-27 20:19 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-03-25 13:09 [Bug debug/94326] New: g++: error: pack.ii: ‘-fcompare-debug’ failure (length) marxin at gcc dot gnu.org 2020-03-25 13:09 ` [Bug debug/94326] " marxin at gcc dot gnu.org 2020-03-25 15:27 ` marxin at gcc dot gnu.org 2020-03-26 12:30 ` [Bug c++/94326] " jakub at gcc dot gnu.org 2020-03-26 12:31 ` jakub at gcc dot gnu.org 2020-03-26 13:58 ` jakub at gcc dot gnu.org 2020-03-26 14:05 ` jakub at gcc dot gnu.org 2020-03-27 9:05 ` cvs-commit at gcc dot gnu.org 2020-03-27 20:19 ` jakub at gcc dot gnu.org
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).