]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
d: Improve UFCS/property error message
authorIain Buclaw <ibuclaw@gdcproject.org>
Sat, 22 Mar 2025 09:49:06 +0000 (10:49 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Sat, 22 Mar 2025 09:55:13 +0000 (10:55 +0100)
Improves on the speller suggestions for UFCS by using the location of
the suggested symbol, and considering that local functions aren't
eligible for UFCS instead of making a nonsensical suggestion, such as
"no property foo, did you mean foo?".

gcc/d/ChangeLog:

* dmd/MERGE: Merge upstream dmd 9d2f034398.

Reviewed-on: https://github.com/dlang/dmd/pull/21046

gcc/d/dmd/MERGE
gcc/d/dmd/typesem.d
gcc/testsuite/gdc.test/fail_compilation/fail347.d
gcc/testsuite/gdc.test/fail_compilation/ufcs.d

index 9982d0dd83ef50b3f19118aab4bedcb6454d8aea..0b554f126a6ddb647a8ecc0b8b76cfa83a09e300 100644 (file)
@@ -1,4 +1,4 @@
-94950cae582d89f5ba2720786522f669f620f9d1
+9d2f034398c33be1a28d8c60721014a6ab34d652
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
index 65bad387ef80b1513107d9b6998ce098bdfa3278..c5a3b83379a93b84d18b028daea9ba164830176c 100644 (file)
@@ -3444,8 +3444,16 @@ Expression getProperty(Type t, Scope* scope_, Loc loc, Identifier ident, int fla
                 auto s2 = scope_.search_correct(ident);
                 // UFCS
                 if (s2 && s2.isFuncDeclaration)
-                    errorSupplemental(loc, "did you mean %s `%s`?",
-                        s2.kind(), s2.toChars());
+                {
+                    if (s2.ident == ident)
+                    {
+                        errorSupplemental(s2.loc, "cannot call %s `%s` with UFCS because it is not declared at module scope",
+                            s2.kind(), s2.toChars());
+                    }
+                    else
+                        errorSupplemental(s2.loc, "did you mean %s `%s`?",
+                            s2.kind(), s2.toChars());
+                }
                 else if (src.type.ty == Tpointer)
                 {
                     // structPtr.field
@@ -3454,7 +3462,7 @@ Expression getProperty(Type t, Scope* scope_, Loc loc, Identifier ident, int fla
                     {
                         if (auto s3 = as.search_correct(ident))
                         {
-                            errorSupplemental(loc, "did you mean %s `%s`?",
+                            errorSupplemental(s3.loc, "did you mean %s `%s`?",
                                 s3.kind(), s3.toChars());
                         }
                     }
index e495ba257e358a1b17898232a5338160e12327af..c56acf5642cdef69da5d37fe218cbc7e0b641cf9 100644 (file)
@@ -5,10 +5,10 @@ TEST_OUTPUT:
 fail_compilation/fail347.d(26): Error: undefined identifier `bbr`, did you mean variable `bar`?
 fail_compilation/fail347.d(27): Error: no property `ofo` for type `S`, did you mean `fail347.S.foo`?
 fail_compilation/fail347.d(29): Error: no property `fool` for `sp` of type `fail347.S*`
-fail_compilation/fail347.d(29):        did you mean variable `foo`?
+fail_compilation/fail347.d(20):        did you mean variable `foo`?
 fail_compilation/fail347.d(30): Error: undefined identifier `strlenx`, did you mean function `strlen`?
 fail_compilation/fail347.d(31): Error: no property `strlenx` for `"hello"` of type `string`
-fail_compilation/fail347.d(31):        did you mean function `strlen`?
+fail_compilation/imports/fail347a.d(3):        did you mean function `strlen`?
 ---
 */
 
index 3a92a691e2f415cac86597fe53e1a18b001c9980..87efbcf65c9ed27f4dbe84fdfb802192697b4fe5 100644 (file)
@@ -1,23 +1,28 @@
 /*
 TEST_OUTPUT:
 ---
-fail_compilation/ufcs.d(26): Error: no property `regularF` for `s` of type `S`
-fail_compilation/ufcs.d(26):        the following error occured while looking for a UFCS match
-fail_compilation/ufcs.d(26): Error: function `regularF` is not callable using argument types `(S)`
-fail_compilation/ufcs.d(26):        expected 0 argument(s), not 1
-fail_compilation/ufcs.d(31):        `ufcs.regularF()` declared here
-fail_compilation/ufcs.d(27): Error: no property `templateF` for `s` of type `S`
-fail_compilation/ufcs.d(27):        the following error occured while looking for a UFCS match
-fail_compilation/ufcs.d(27): Error: template `templateF` is not callable using argument types `!()(S)`
-fail_compilation/ufcs.d(32):        Candidate is: `templateF()()`
-fail_compilation/ufcs.d(28): Error: no property `templateO` for `s` of type `S`
-fail_compilation/ufcs.d(28):        the following error occured while looking for a UFCS match
-fail_compilation/ufcs.d(28): Error: none of the overloads of template `ufcs.templateO` are callable using argument types `!()(S)`
-fail_compilation/ufcs.d(34):        Candidates are: `templateO()(int x)`
-fail_compilation/ufcs.d(35):                        `templateO()(float y)`
+fail_compilation/ufcs.d(31): Error: no property `regularF` for `s` of type `S`
+fail_compilation/ufcs.d(31):        the following error occured while looking for a UFCS match
+fail_compilation/ufcs.d(31): Error: function `regularF` is not callable using argument types `(S)`
+fail_compilation/ufcs.d(31):        expected 0 argument(s), not 1
+fail_compilation/ufcs.d(39):        `ufcs.regularF()` declared here
+fail_compilation/ufcs.d(32): Error: no property `templateF` for `s` of type `S`
+fail_compilation/ufcs.d(32):        the following error occured while looking for a UFCS match
+fail_compilation/ufcs.d(32): Error: template `templateF` is not callable using argument types `!()(S)`
+fail_compilation/ufcs.d(40):        Candidate is: `templateF()()`
+fail_compilation/ufcs.d(33): Error: no property `templateO` for `s` of type `S`
+fail_compilation/ufcs.d(33):        the following error occured while looking for a UFCS match
+fail_compilation/ufcs.d(33): Error: none of the overloads of template `ufcs.templateO` are callable using argument types `!()(S)`
+fail_compilation/ufcs.d(42):        Candidates are: `templateO()(int x)`
+fail_compilation/ufcs.d(43):                        `templateO()(float y)`
+fail_compilation/ufcs.d(36): Error: no property `local` for `s` of type `ufcs.S`
+fail_compilation/ufcs.d(35):        cannot call function `local` with UFCS because it is not declared at module scope
+fail_compilation/ufcs.d(26):        struct `S` defined here
 ---
 */
 
+
+
 struct S { }
 
 void f()
@@ -26,6 +31,9 @@ void f()
     s.regularF();
     s.templateF();
     s.templateO();
+
+    void local(S) {}
+    s.local();
 }
 
 void regularF();