Hi,
On 11/01/19 22:22, Jason Merrill wrote:
On 1/11/19 4:13 PM, Paolo Carlini wrote:
Hi,
On 11/01/19 19:58, Jason Merrill wrote:
On 1/10/19 9:24 AM, Paolo Carlini wrote:
Hi again,
this one is also matter of consistency with, say, the precise
location that we use for the error message at the beginning of
check_methods. Indeed, the sequence of error messages of
g++.dg/inherit/pure1.C reflect that. Tested x86_64-linux.
Thanks, Paolo.
PS: minor issues anyway, but I'm almost done with these low hanging
fruits which I'm proposing to fix for 9 too....
Hmm, wouldn't it be preferable to use the location of the
initializer when the initializer is the problem?
I see what you mean and indeed yesterday I gave that some thought. In
practice, we have the usual issue that currently constants don't have
a location
They do now in a lot more cases, with location wrappers. If not, we
could fall back on the decl location with EXPR_LOC_OR_LOC.
Yes. And that's what we are in fact already doing in all the other uses
of cp_expr_loc_or_loc in decl.c. Seems a good solution to me too. I'm
finishing testing the below.
Thanks, Paolo.
////////////////////
Index: cp/decl.c
===================================================================
--- cp/decl.c (revision 267858)
+++ cp/decl.c (working copy)
@@ -7293,7 +7293,10 @@ cp_finish_decl (tree decl, tree init, bool init_co
synthesize_method (decl);
}
else
- error ("function %q#D is initialized like a variable", decl);
+ error_at (cp_expr_loc_or_loc (init,
+ DECL_SOURCE_LOCATION (decl)),
+ "function %q#D is initialized like a variable",
+ decl);
}
/* else no initialization required. */
}
Index: cp/decl2.c
===================================================================
--- cp/decl2.c (revision 267858)
+++ cp/decl2.c (working copy)
@@ -924,12 +924,14 @@ grokfield (const cp_declarator *declarator,
else
{
gcc_assert (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE);
+ location_t iloc
+ = cp_expr_loc_or_loc (init, DECL_SOURCE_LOCATION (value));
if (friendp)
- error ("initializer specified for friend function %qD",
- value);
+ error_at (iloc, "initializer specified for friend "
+ "function %qD", value);
else
- error ("initializer specified for static member function %qD",
- value);
+ error_at (iloc, "initializer specified for static "
+ "member function %qD", value);
}
}
else if (TREE_CODE (value) == FIELD_DECL)
Index: testsuite/g++.dg/cpp0x/pr62101.C
===================================================================
--- testsuite/g++.dg/cpp0x/pr62101.C (revision 267858)
+++ testsuite/g++.dg/cpp0x/pr62101.C (working copy)
@@ -3,7 +3,7 @@
struct X
{
- friend void g(X, int) = 0; // { dg-error "initializer specified for friend
function" }
+ friend void g(X, int) = 0; // { dg-error "15:initializer specified for
friend function" }
friend void g(X, int) = default; // { dg-error "cannot be defaulted" }
// { dg-prune-output "note" }
friend void f(X, int) = delete;
Index: testsuite/g++.dg/inherit/pure1.C
===================================================================
--- testsuite/g++.dg/inherit/pure1.C (revision 267858)
+++ testsuite/g++.dg/inherit/pure1.C (working copy)
@@ -2,13 +2,13 @@
// Origin: Volker Reichelt <reich...@igpm.rwth-aachen.de>
// { dg-do compile }
-void foo0() = 0; // { dg-error "like a variable" }
+void foo0() = 0; // { dg-error "6:function .void foo0\\(\\).
is initialized like a variable" }
virtual void foo1() = 0; // { dg-error "1:'virtual' outside class" }
-// { dg-error "like a variable" "" { target *-*-* } .-1 }
+// { dg-error "14:function .void foo1\\(\\). is initialized like a variable"
"" { target *-*-* } .-1 }
struct A
{
- void foo2() = 0; // { dg-error "non-virtual" }
- static void foo3() = 0; // { dg-error "static member" }
+ void foo2() = 0; // { dg-error "8:initializer specified for
non-virtual method" }
+ static void foo3() = 0; // { dg-error "15:initializer specified for
static member function" }
virtual static void foo4() = 0; // { dg-error "both 'virtual' and 'static'"
}
virtual void foo5() = 0; // { dg-error "base class" }
};
@@ -15,5 +15,6 @@ struct A
struct B : A
{
- static void foo5() = 0; // { dg-error "static member|declared" }
+ static void foo5() = 0; // { dg-error "15:initializer specified for
static member function" }
+// { dg-error "declared" "" { target *-*-* } .-1 }
};