aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/decl2.c13
-rw-r--r--gcc/cp/method.c13
3 files changed, 25 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b8f356f..3375ed0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2005-02-15 Alexandre Oliva <aoliva@redhat.com>
+
+ * decl2.c (mark_used): Set the source location of the used decl to
+ the current input location here...
+ * method.c (synthesize_method): ... not here. Set input_location
+ from the decl instead.
+
2005-02-14 Nathan Sidwell <nathan@codesourcery.com>
PR c++/19608
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 0a74ed7..c7b0415 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -3161,9 +3161,20 @@ mark_used (tree decl)
&& DECL_ARTIFICIAL (decl)
&& !DECL_THUNK_P (decl)
&& ! DECL_INITIAL (decl)
- /* Kludge: don't synthesize for default args. */
+ /* Kludge: don't synthesize for default args. Unfortunately this
+ rules out initializers of namespace-scoped objects too, but
+ it's sort-of ok if the implicit ctor or dtor decl keeps
+ pointing to the class location. */
&& current_function_decl)
{
+ /* Put the function definition at the position where it is needed,
+ rather than within the body of the class. That way, an error
+ during the generation of the implicit body points at the place
+ where the attempt to generate the function occurs, giving the
+ user a hint as to why we are attempting to generate the
+ function. */
+ DECL_SOURCE_LOCATION (decl) = input_location;
+
synthesize_method (decl);
/* If we've already synthesized the method we don't need to
instantiate it, so we can return right away. */
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index fadbf39..85e2b3f 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -705,12 +705,15 @@ synthesize_method (tree fndecl)
tree context = decl_function_context (fndecl);
bool need_body = true;
tree stmt;
+ location_t save_input_location = input_location;
/* If we've been asked to synthesize a clone, just synthesize the
cloned function instead. Doing so will automatically fill in the
body for the clone. */
if (DECL_CLONED_FUNCTION_P (fndecl))
{
+ DECL_SOURCE_LOCATION (DECL_CLONED_FUNCTION (fndecl)) =
+ DECL_SOURCE_LOCATION (fndecl);
synthesize_method (DECL_CLONED_FUNCTION (fndecl));
return;
}
@@ -724,13 +727,7 @@ synthesize_method (tree fndecl)
else if (nested)
push_function_context_to (context);
- /* Put the function definition at the position where it is needed,
- rather than within the body of the class. That way, an error
- during the generation of the implicit body points at the place
- where the attempt to generate the function occurs, giving the
- user a hint as to why we are attempting to generate the
- function. */
- DECL_SOURCE_LOCATION (fndecl) = input_location;
+ input_location = DECL_SOURCE_LOCATION (fndecl);
start_preparsed_function (fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
stmt = begin_function_body ();
@@ -761,6 +758,8 @@ synthesize_method (tree fndecl)
finish_function_body (stmt);
expand_or_defer_fn (finish_function (0));
+ input_location = save_input_location;
+
if (! context)
pop_from_top_level ();
else if (nested)