re PR c/68533 (bogus location for "warning: ‘struct s3’ declared inside parameter...
authorJakub Jelinek <jakub@redhat.com>
Wed, 2 Dec 2015 07:33:06 +0000 (08:33 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 2 Dec 2015 07:33:06 +0000 (08:33 +0100)
PR c/68533
* c-decl.c (get_parm_info): Use b->locus instead of input_location
for diagnostics.

* gcc.dg/pr68533.c: New test.

From-SVN: r231147

gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr68533.c [new file with mode: 0644]

index 43d1579..acb8ee4 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/68533
+       * c-decl.c (get_parm_info): Use b->locus instead of input_location
+       for diagnostics.
+
 2015-12-01  Julian Brown  <julian@codesourcery.com>
            Cesar Philippidis  <cesar@codesourcery.com>
            James Norris  <James_Norris@mentor.com>
index 31de0a5..efb0a52 100644 (file)
@@ -6913,11 +6913,11 @@ get_parm_info (bool ellipsis, tree expr)
     {
       if (TYPE_QUALS (TREE_TYPE (b->decl)) != TYPE_UNQUALIFIED
          || C_DECL_REGISTER (b->decl))
-       error ("%<void%> as only parameter may not be qualified");
+       error_at (b->locus, "%<void%> as only parameter may not be qualified");
 
       /* There cannot be an ellipsis.  */
       if (ellipsis)
-       error ("%<void%> must be the only parameter");
+       error_at (b->locus, "%<void%> must be the only parameter");
 
       arg_info->types = void_list_node;
       return arg_info;
@@ -6946,13 +6946,14 @@ get_parm_info (bool ellipsis, tree expr)
 
          /* Check for forward decls that never got their actual decl.  */
          if (TREE_ASM_WRITTEN (decl))
-           error ("parameter %q+D has just a forward declaration", decl);
+           error_at (b->locus,
+                     "parameter %q+D has just a forward declaration", decl);
          /* Check for (..., void, ...) and issue an error.  */
          else if (VOID_TYPE_P (type) && !DECL_NAME (decl))
            {
              if (!gave_void_only_once_err)
                {
-                 error ("%<void%> must be the only parameter");
+                 error_at (b->locus, "%<void%> must be the only parameter");
                  gave_void_only_once_err = true;
                }
            }
@@ -6991,13 +6992,13 @@ get_parm_info (bool ellipsis, tree expr)
            {
              if (b->id)
                /* The %s will be one of 'struct', 'union', or 'enum'.  */
-               warning_at (input_location, 0,
+               warning_at (b->locus, 0,
                            "%<%s %E%> declared inside parameter list"
                            " will not be visible outside of this definition or"
                            " declaration", keyword, b->id);
              else
                /* The %s will be one of 'struct', 'union', or 'enum'.  */
-               warning_at (input_location, 0,
+               warning_at (b->locus, 0,
                            "anonymous %s declared inside parameter list"
                            " will not be visible outside of this definition or"
                            " declaration", keyword);
index 3363c95..da31935 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/68533
+       * gcc.dg/pr68533.c: New test.
+
 2015-12-01  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR tree-optimization/68577
diff --git a/gcc/testsuite/gcc.dg/pr68533.c b/gcc/testsuite/gcc.dg/pr68533.c
new file mode 100644 (file)
index 0000000..e1a1f31
--- /dev/null
@@ -0,0 +1,68 @@
+/* PR c/68533 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct T { int t; };
+
+void
+f1 (
+  struct S *   /* { dg-warning "declared inside parameter list will not be visible outside of this definition or declaration" } */
+  x,
+  struct T *
+  y
+   )
+{
+  y->t = 4;
+}
+
+void
+f2 (
+  struct {int s;} * /* { dg-warning "anonymous struct declared inside parameter list will not be visible outside of this definition or declaration" } */
+  x,
+  struct T *
+  y
+   )
+{
+  y->t = 5;
+}
+
+void
+f3 (
+  const void
+   )           /* { dg-error "'void' as only parameter may not be qualified" } */
+{
+}
+
+void
+f4 (
+   void,       /* { dg-error "'void' must be the only parameter" } */
+   ...
+   )
+{
+}
+
+void
+f5 (
+   int
+   x;          /* { dg-error "parameter 'x' has just a forward declaration" } */
+   int y
+   )
+{
+}
+
+void
+f6 (
+   int
+   x,
+   void
+   )           /* { dg-error "'void' must be the only parameter" } */
+{
+}
+
+void
+f7 (
+   void,       /* { dg-error "'void' must be the only parameter" } */
+   int y
+   )
+{
+}