On Fri, Aug 24, 2018 at 3:01 AM, Marek Polacek <[email protected]> wrote:
> On Tue, Aug 21, 2018 at 11:59:06PM +1200, Jason Merrill wrote:
>> On Fri, Aug 17, 2018 at 2:17 PM, Marek Polacek <[email protected]> wrote:
>> > As I promised in
>> > <https://gcc.gnu.org/ml/gcc-patches/2018-08/msg00908.html>,
>> > this patch fixes a couple of invalid cases we weren't detecting. It's got
>> > testcases from two PRs and another case I found out; they're intertwined so
>> > I think it makes sense to fix them in one go.
>> >
>> > Bootstrapped/regtested on x86_64-linux, ok for trunk?
>> >
>> > 2018-08-16 Marek Polacek <[email protected]>
>> >
>> > PR c++/86942
>> > PR c++/67012
>> > * decl.c (grokdeclarator): Disallow functions with trailing return
>> > type with decltype(auto) as its type. Also check the function if
>> > it's inner declarator doesn't exist.
>> >
>> > * g++.dg/cpp0x/auto52.C: New test.
>> > * g++.dg/cpp1y/auto-fn52.C: New test.
>> > * g++.dg/cpp1y/auto-fn53.C: New test.
>> > * g++.dg/cpp1y/auto-fn54.C: New test.
>> >
>> > diff --git gcc/cp/decl.c gcc/cp/decl.c
>> > index fa58bc4d2b3..8261f8e30e5 100644
>> > --- gcc/cp/decl.c
>> > +++ gcc/cp/decl.c
>> > @@ -11238,7 +11238,10 @@ grokdeclarator (const cp_declarator *declarator,
>> >
>> > /* Handle a late-specified return type. */
>> > tree late_return_type =
>> > declarator->u.function.late_return_type;
>> > - if (funcdecl_p)
>> > + if (funcdecl_p
>> > + /* This is the case e.g. for
>> > + using T = auto () -> int. */
>> > + || inner_declarator == NULL)
>>
>> Hmm, checking funcdecl_p here seems just wrong; these errors should be
>> the same regardless of whether this is declaring a function. What
>> breaks if we just remove this condition? The deduction guide errors
>> will need to be adjusted to handle the abstract declarator case, but
>> that looks like the only spot that would need fixing.
>
> That was my first idea but it breaks with pointers to functions and pointers
> to member functions as in auto2.C:
>
> auto (*fp)() = f;
> where the declarators are: cdk_function -> cdk_pointer -> cdk_id
> auto (A::*pmf)() = &A::f;
> where the declarators are: cdk_function -> cdk_ptrmem -> cdk_id
>
> it complains that a function uses 'auto' type specifier without trailing
> return type
Ah, right.
>> > {
>> > if (tree auto_node = type_uses_auto (type))
>> > {
>> > @@ -11270,6 +11273,18 @@ grokdeclarator (const cp_declarator *declarator,
>> > name, type);
>> > return error_mark_node;
>> > }
>> > + else if (is_auto (type)
>> > + && (TYPE_IDENTIFIER (type)
>> > + == decltype_auto_identifier))
>>
>> I think you want AUTO_IS_DECLTYPE here.
>
> Ah, nice.
OK with this change, then.
Jason