Hi Jason, On 4 Feb 2025, at 16:39, Jason Merrill wrote:
> On 1/15/25 9:56 AM, Jason Merrill wrote: >> On 1/15/25 7:24 AM, Simon Martin wrote: >>> Hi, >>> >>> On 14 Jan 2025, at 23:31, Jason Merrill wrote: >>> >>>> On 1/14/25 2:13 PM, Simon Martin wrote: >>>>> On 10 Jan 2025, at 19:10, Andrew Pinski wrote: >>>>>> On Fri, Jan 10, 2025 at 3:18 AM Simon Martin >>>>>> <si...@nasilyan.com> >>>>>> wrote: >>>>>>> >>>>>>> We currently accept the following invalid code (EDG and MSVC do >>>>>>> as >>>>>>> well) >>>>>> >>>>>> clang does too: >>>>>> https://github.com/llvm/llvm-project/issues/121706 . >>> >>>>>> >>>>>> Note it might be useful if a testcase with multiply `*` is >>>>>> included >>>>> >>>>>> too: >>>>>> ``` >>>>>> struct A { >>>>>> ****A (); >>>>>> }; >>>>>> ``` >>>>> Thanks, makes sense to add those. Done in the attached updated >>>>> revision, >>>>> successfully tested on x86_64-pc-linux-gnu. >>>> >>>>> +/* Check that it's OK to declare a function at ID_LOC with the >>>>> indicated TYPE, >>>>> + TYPE_QUALS and DECLARATOR. SFK indicates the kind of >>>>> special >>>>> function (if >>>>> + any) that this function is. OPTYPE is the type given in a >>>>> conversion >>>>> operator declaration, or the class type for a >>>>> constructor/destructor. >>>>> Returns the actual return type of the function; that may >>>>> be >>>>> different >>>>> than TYPE if an error occurs, or for certain special >>>>> functions. >>>>> */ >>>>> @@ -12361,8 +12362,19 @@ check_special_function_return_type >>>>> (special_function_kind sfk, >>>>> tree type, >>>>> tree optype, >>>>> int type_quals, >>>>> + const cp_declarator >>>>> *declarator, >>>>> + location_t id_loc, >>>> >>>> id_loc should be the same as declarator->id_loc? >>> You’re right. >>> >>>>> const location_t* >>>>> locations) >>>>> { >>>>> + /* If TYPE is unspecified, DECLARATOR, if set, should not >>>>> represent a pointer >>>>> + or a reference type. */ >>>>> + if (type == NULL_TREE >>>>> + && declarator >>>>> + && (declarator->kind == cdk_pointer >>>>> + || declarator->kind == cdk_reference)) >>>>> + error_at (id_loc, "expected unqualified-id before %qs >>>>> token", >>>>> + declarator->kind == cdk_pointer ? "*" : "&"); >>>> >>>> ...and id_loc isn't the location of the ptr-operator, it's the >>>> location of the identifier, so this indicates the wrong column. I >>>> think using declarator->id_loc makes sense, just not pretending >>>> it's >>>> the location of the *. >>> Good catch, thanks. >>> >>>> Let's give diagnostics more like the others later in the function >>>> instead of trying to emulate cp_parser_error. >>> Makes sense. This is what the updated patch does, successfully >>> tested on >>> x86_64-pc-linux-gnu. OK for GCC 16? >> >> OK. > > Does this also fix 118304? If so, let's go ahead and apply it to GCC > 15. I have checked just now, and we still ICE for 118304’s testcase with that fix. Simon