public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "federico.kircheis at gmail dot com" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/101557] New: the value of '<temporary>' is not usable in a constant expression Date: Wed, 21 Jul 2021 15:13:19 +0000 [thread overview] Message-ID: <bug-101557-4@http.gcc.gnu.org/bugzilla/> (raw) https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101557 Bug ID: 101557 Summary: the value of '<temporary>' is not usable in a constant expression Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: federico.kircheis at gmail dot com Target Milestone: --- Consider following snippet ---- struct node { const char* d; const node& left; const node& right; }; constexpr const node Null = node{"",Null,Null}; constexpr const node a { "a", node { "b", node{"e",Null,Null}, node{"d",Null,Null}, }, node{"c",Null,Null}, }; constexpr int mysize(const node& n) noexcept{ return (&n == &Null) ? 0 : 1 + mysize(n.left) + mysize(n.right); } constexpr auto size0 = mysize(Null); static_assert(size0 == 0, ""); constexpr auto size1 = mysize(node{"c", Null, Null}); static_assert(size1 == 1, ""); constexpr auto size2 = mysize(node { "b", node{"e",Null,Null}, node{"d",Null,Null}, }); static_assert(size2 == 3, ""); // this line does not compile constexpr auto size3 = mysize(a); static_assert(size3 == 5, ""); ---- The expression `constexpr auto size3 = mysize(a);` does not compile with the error message ---- <source>:41:30: in 'constexpr' expansion of 'mysize(a)' <source>:25:42: in 'constexpr' expansion of 'mysize((* & n.node::left))' <source>:41:32: error: the value of '<temporary>' is not usable in a constant expression 41 | constexpr auto size3 = mysize(a); | ^ <source>:22:1: note: '<temporary>' was not declared 'constexpr' 22 | }; | ^ Compiler returned: 1 ---- A similar effect can be achieved with ---- constexpr node b = a.left; ---- with following error ---- <source>:45:23: error: the value of '<temporary>' is not usable in a constant expression 45 | constexpr node b2 = a.left; | ^~~~ <source>:22:1: note: '<temporary>' was not declared 'constexpr' 22 | }; | ^ Compiler returned: 1 ---- even if ---- constexpr node b = a; ---- compiles without warnings. Generally accessing subobjects should not be an issue, for example ---- struct sub{}; struct node2{ const sub& s; }; constexpr const node2 n2{ sub{} }; constexpr auto s = n2.s; ---- also compiles without issues
next reply other threads:[~2021-07-21 15:13 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-07-21 15:13 federico.kircheis at gmail dot com [this message] 2021-07-21 15:24 ` [Bug c++/101557] " jakub at gcc dot gnu.org 2021-07-21 16:03 ` federico.kircheis at gmail dot com 2021-07-21 16:07 ` pinskia at gcc dot gnu.org 2021-07-21 16:15 ` federico.kircheis at gmail dot com 2023-04-16 9:31 ` federico at kircheis dot it
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=bug-101557-4@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).