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?

                                    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 *.

Let's give diagnostics more like the others later in the function instead of trying to emulate cp_parser_error.

Jason

Reply via email to