OSDN Git Service

PR c++/39055
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Feb 2012 08:39:51 +0000 (08:39 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Feb 2012 08:39:51 +0000 (08:39 +0000)
* decl.c (local_variable_p_walkfn): Don't check DECL_ARTIFICIAL.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184199 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/overload/defarg5.C [new file with mode: 0644]

index 6680668..c20077c 100644 (file)
@@ -1,3 +1,8 @@
+2012-02-14  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39055
+       * decl.c (local_variable_p_walkfn): Don't check DECL_ARTIFICIAL.
+
 2012-02-14  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/52181
index 8fcfbd5..f0ba181 100644 (file)
@@ -10509,7 +10509,9 @@ static tree
 local_variable_p_walkfn (tree *tp, int *walk_subtrees,
                         void *data ATTRIBUTE_UNUSED)
 {
-  if (local_variable_p (*tp) && !DECL_ARTIFICIAL (*tp))
+  /* Check DECL_NAME to avoid including temporaries.  We don't check
+     DECL_ARTIFICIAL because we do want to complain about 'this'.  */
+  if (local_variable_p (*tp) && DECL_NAME (*tp))
     return *tp;
   else if (TYPE_P (*tp))
     *walk_subtrees = 0;
@@ -10517,7 +10519,6 @@ local_variable_p_walkfn (tree *tp, int *walk_subtrees,
   return NULL_TREE;
 }
 
-
 /* Check that ARG, which is a default-argument expression for a
    parameter DECL, is valid.  Returns ARG, or ERROR_MARK_NODE, if
    something goes wrong.  DECL may also be a _TYPE node, rather than a
@@ -10578,7 +10579,10 @@ check_default_argument (tree decl, tree arg)
   var = cp_walk_tree_without_duplicates (&arg, local_variable_p_walkfn, NULL);
   if (var)
     {
-      error ("default argument %qE uses local variable %qD", arg, var);
+      if (DECL_NAME (var) == this_identifier)
+       permerror (input_location, "default argument %qE uses %qD", arg, var);
+      else
+       error ("default argument %qE uses local variable %qD", arg, var);
       return error_mark_node;
     }
 
index bd0b638..38d09e5 100644 (file)
@@ -1,3 +1,8 @@
+2012-02-14  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39055
+       * g++.dg/overload/defarg5.C: New.
+
 2012-02-14  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/52181
diff --git a/gcc/testsuite/g++.dg/overload/defarg5.C b/gcc/testsuite/g++.dg/overload/defarg5.C
new file mode 100644 (file)
index 0000000..06ea6bf
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/39055
+
+struct A
+{
+  int i;
+  A() { void foo(int=i); }     // { dg-error "this" }
+};