From: Jason Merrill <jason@redhat.com>
To: Alexandre Oliva <aoliva@redhat.com>, gcc-patches@gcc.gnu.org
Subject: Re: [C++ Patch] [PR c++/88146] do not crash synthesizing inherited ctor(...)
Date: Fri, 14 Dec 2018 21:41:00 -0000 [thread overview]
Message-ID: <dc1fc81d-4936-4816-26f2-7599ce0fe84f@redhat.com> (raw)
In-Reply-To: <81ac6c22-8907-a166-b8df-80e06d2850da@redhat.com>
On 12/14/18 3:42 PM, Jason Merrill wrote:
> On 12/6/18 7:23 PM, Alexandre Oliva wrote:
>> This patch started out from the testcase in PR88146, that attempted to
>> synthesize an inherited ctor without any args before a varargs
>> ellipsis and crashed while at that, because of the unguarded
>> dereferencing of the parm type list, that usually contains a
>> terminator. The terminator is not there for varargs functions,
>> however, and without any other args, we ended up dereferencing a NULL
>> pointer. Oops.
>>
>> Guarding the accesses there was easy, but I missed the sorry message
>> we got in other testcases that passed arguments through the ellipsis
>> in inherited ctors. I put a check in, and noticed the inherited ctors
>> were synthesized with the location assigned to the class name,
>> although they were initially assigned the location of the using
>> declaration. I decided the latter was better, and arranged for the
>> better location to be retained.
>>
>> Further investigation revealed the lack of a sorry message had to do
>> with the call being in a non-evaluated context, in this case, a
>> noexcept expression. The sorry would be correctly reported in other
>> contexts, so I rolled back the check I'd added, but retained the
>> source location improvement.
>>
>> I was still concerned about issuing sorry messages while instantiating
>> template ctors even in non-evaluated contexts, e.g., if a template
>> ctor had a base initializer that used an inherited ctor with enough
>> arguments that they'd go through an ellipsis. I wanted to defer the
>> instantiation of such template ctors, but that would have been wrong
>> for constexpr template ctors, and already done for non-constexpr ones.
>> So, I just consolidated multiple test variants into a single testcase
>> that explores and explains various of the possibilities I thought of.
>>
>> Regstrapped on x86_64- and i686-linux-gnu, mistakenly along with a patch
>> with a known regression, and got only that known regression. Retesting
>> without it. Ok to install?
>>
>>
>> for gcc/cp/ChangeLog
>>
>> Â Â Â Â PR c++/88146
>> Â Â Â Â * method.c (do_build_copy_constructor): Do not crash with
>> Â Â Â Â ellipsis-only parm list.
>> Â Â Â Â (synthesize_method): Retain location of inherited ctor.
>>
>> for gcc/testsuite/ChangeLog
>>
>> Â Â Â Â PR c++/88146
>> Â Â Â Â * g++.dg/cpp0x/inh-ctor32.C: New.
>> ---
>>  gcc/cp/method.c                        |   9 +
>> Â gcc/testsuite/g++.dg/cpp0x/inh-ctor32.C |Â 229
>> +++++++++++++++++++++++++++++++
>> Â 2 files changed, 234 insertions(+), 4 deletions(-)
>> Â create mode 100644 gcc/testsuite/g++.dg/cpp0x/inh-ctor32.C
>>
>> diff --git a/gcc/cp/method.c b/gcc/cp/method.c
>> index fd023e200538..41d609fb1de6 100644
>> --- a/gcc/cp/method.c
>> +++ b/gcc/cp/method.c
>> @@ -643,7 +643,7 @@ do_build_copy_constructor (tree fndecl)
>> Â Â Â bool trivial = trivial_fn_p (fndecl);
>> Â Â Â tree inh = DECL_INHERITED_CTOR (fndecl);
>> -Â if (!inh)
>> +Â if (parm && !inh)
>> Â Â Â Â Â parm = convert_from_reference (parm);
>
> If inh is false, we're a copy constructor, which always has a parm, so
> this hunk seems unnecessary.
>
>> Â Â Â if (trivial)
>> @@ -677,7 +677,7 @@ do_build_copy_constructor (tree fndecl)
>> Â Â Â Â Â {
>> Â Â Â Â Â Â Â tree fields = TYPE_FIELDS (current_class_type);
>> Â Â Â Â Â Â Â tree member_init_list = NULL_TREE;
>> -Â Â Â Â Â int cvquals = cp_type_quals (TREE_TYPE (parm));
>> +Â Â Â Â Â int cvquals = parm ? cp_type_quals (TREE_TYPE (parm)) : 0;
>
> This could also check !inh.
And in the existing code, while I'm looking at it:
> for (; fields; fields = DECL_CHAIN (fields))
> {
> tree field = fields;
> tree expr_type;
>
> if (TREE_CODE (field) != FIELD_DECL)
> continue;
> if (inh)
> continue;
The "if (inh) continue" is odd, there's no reason to iterate through the
fields ignoring all of them when we could skip the loop entirely.
Jason
next prev parent reply other threads:[~2018-12-14 21:41 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-07 0:23 Alexandre Oliva
2018-12-14 20:14 ` Alexandre Oliva
2018-12-14 20:42 ` Jason Merrill
2018-12-14 21:41 ` Jason Merrill [this message]
2018-12-14 22:34 ` Alexandre Oliva
2018-12-14 22:44 ` Jason Merrill
2018-12-14 23:05 ` Alexandre Oliva
2018-12-15 22:11 ` Jason Merrill
2018-12-19 14:36 ` Christophe Lyon
2018-12-19 18:49 ` Alexandre Oliva
2018-12-19 18:52 ` Jakub Jelinek
2018-12-20 0:04 ` Alexandre Oliva
2018-12-20 16:00 ` Christophe Lyon
2018-12-20 16:18 ` Jason Merrill
2018-12-28 22:53 ` Alexandre Oliva
2018-12-29 6:40 ` Alexandre Oliva
2018-12-29 13:33 ` Jakub Jelinek
2019-01-04 18:55 ` Jason Merrill
2019-01-17 4:12 ` Alexandre Oliva
2018-12-29 10:28 ` Alexandre Oliva
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=dc1fc81d-4936-4816-26f2-7599ce0fe84f@redhat.com \
--to=jason@redhat.com \
--cc=aoliva@redhat.com \
--cc=gcc-patches@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: link
Be 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).