]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/35017 (PR11377 pedwarns even about valid code)
authorJakub Jelinek <jakub@redhat.com>
Tue, 29 Jan 2008 23:19:07 +0000 (00:19 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 29 Jan 2008 23:19:07 +0000 (00:19 +0100)
PR c/35017
* c-decl.c (start_decl): Don't pedwarn about TREE_READONLY
static decls.
* c-typeck.c (build_external_ref): Don't pedwarn about
static vars in current function's scope.

* gcc.dg/inline-25.c: New test.
* gcc.dg/inline-26.c: New test.
* gcc.dg/inline-27.c: New test.

From-SVN: r131945

gcc/ChangeLog
gcc/c-decl.c
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/inline-25.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/inline-26.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/inline-27.c [new file with mode: 0644]

index f8686f30f460e9a393b110e7b9bb37a94124bd3d..5c5c8848e43b9c4c3c20693a08eeaa9975d91cbd 100644 (file)
@@ -1,3 +1,11 @@
+2008-01-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/35017
+       * c-decl.c (start_decl): Don't pedwarn about TREE_READONLY
+       static decls.
+       * c-typeck.c (build_external_ref): Don't pedwarn about
+       static vars in current function's scope.
+
 2008-01-29  Joseph Myers  <joseph@codesourcery.com>
 
        * config.gcc (i[34567]86-*-nto-qnx*): Remove deprecation.
index 860b337fc958124875a021cd4ef2fe864e36fba8..1af84da39402e0420ddb9aed1a6f6d8f042887e7 100644 (file)
@@ -3320,6 +3320,7 @@ start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs,
   if (TREE_CODE (decl) == VAR_DECL
       && current_scope != file_scope
       && TREE_STATIC (decl)
+      && !TREE_READONLY (decl)
       && DECL_DECLARED_INLINE_P (current_function_decl)
       && DECL_EXTERNAL (current_function_decl))
     pedwarn ("%q+D is static but declared in inline function %qD "
index fb2e47f096996e7883cc90dcd5d61c8500fada7c..60b0b02fc042a38a88c21238a8a35dd64c31566d 100644 (file)
@@ -1,6 +1,6 @@
 /* Build expressions with type checking for C compiler.
    Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -2234,7 +2234,8 @@ build_external_ref (tree id, int fun, location_t loc)
           && DECL_EXTERNAL (current_function_decl)
           && VAR_OR_FUNCTION_DECL_P (ref)
           && (TREE_CODE (ref) != VAR_DECL || TREE_STATIC (ref))
-          && ! TREE_PUBLIC (ref))
+          && ! TREE_PUBLIC (ref)
+          && DECL_CONTEXT (ref) != current_function_decl)
     pedwarn ("%H%qD is static but used in inline function %qD "
             "which is not static", &loc, ref, current_function_decl);
 
index 86bfcc7a34b460713d54d492d767a13e1cd16d19..11239a5e9cc694725a8ab864308944853d4853a6 100644 (file)
@@ -1,3 +1,10 @@
+2008-01-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/35017
+       * gcc.dg/inline-25.c: New test.
+       * gcc.dg/inline-26.c: New test.
+       * gcc.dg/inline-27.c: New test.
+
 2008-01-29  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/35006
diff --git a/gcc/testsuite/gcc.dg/inline-25.c b/gcc/testsuite/gcc.dg/inline-25.c
new file mode 100644 (file)
index 0000000..8063d6c
--- /dev/null
@@ -0,0 +1,145 @@
+/* PR c/35017 */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+static int a = 6;
+static const int b = 6;
+int c = 6;
+
+inline int
+fn1 (void)
+{
+  return a;            /* { dg-error "used in inline" } */
+}
+
+inline int
+fn2 (void)
+{
+  return b;            /* { dg-error "used in inline" } */
+}
+
+inline int
+fn3 (void)
+{
+  return c;
+}
+
+inline int
+fn4 (void)
+{
+  static int d = 6;    /* { dg-error "declared in inline" } */
+  return d;
+}
+
+inline int
+fn5 (void)
+{
+  static const int e = 6;
+  return e;
+}
+
+inline int
+fn6 (void)
+{
+  int f = 6;
+  return f;
+}
+
+inline int
+fn7 (int i)
+{
+  static const char g[10] = "abcdefghij";
+  return g[i];
+}
+
+extern inline int
+fn8 (void)
+{
+  return a;
+}
+
+extern inline int
+fn9 (void)
+{
+  return b;
+}
+
+extern inline int
+fn10 (void)
+{
+  return c;
+}
+
+extern inline int
+fn11 (void)
+{
+  static int d = 6;
+  return d;
+}
+
+extern inline int
+fn12 (void)
+{
+  static const int e = 6;
+  return e;
+}
+
+extern inline int
+fn13 (void)
+{
+  int f = 6;
+  return f;
+}
+
+extern inline int
+fn14 (int i)
+{
+  static const char g[10] = "abcdefghij";
+  return g[i];
+}
+
+static inline int
+fn15 (void)
+{
+  return a;
+}
+
+static inline int
+fn16 (void)
+{
+  return b;
+}
+
+static inline int
+fn17 (void)
+{
+  return c;
+}
+
+static inline int
+fn18 (void)
+{
+  static int d = 6;
+  return d;
+}
+
+static inline int
+fn19 (void)
+{
+  static const int e = 6;
+  return e;
+}
+
+static inline int
+fn20 (void)
+{
+  int f = 6;
+  return f;
+}
+
+static inline int
+fn21 (int i)
+{
+  static const char g[10] = "abcdefghij";
+  return g[i];
+}
diff --git a/gcc/testsuite/gcc.dg/inline-26.c b/gcc/testsuite/gcc.dg/inline-26.c
new file mode 100644 (file)
index 0000000..02f78bb
--- /dev/null
@@ -0,0 +1,145 @@
+/* PR c/35017 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+static int a = 6;
+static const int b = 6;
+int c = 6;
+
+inline int
+fn1 (void)
+{
+  return a;            /* { dg-warning "used in inline" } */
+}
+
+inline int
+fn2 (void)
+{
+  return b;            /* { dg-warning "used in inline" } */
+}
+
+inline int
+fn3 (void)
+{
+  return c;
+}
+
+inline int
+fn4 (void)
+{
+  static int d = 6;    /* { dg-warning "declared in inline" } */
+  return d;
+}
+
+inline int
+fn5 (void)
+{
+  static const int e = 6;
+  return e;
+}
+
+inline int
+fn6 (void)
+{
+  int f = 6;
+  return f;
+}
+
+inline int
+fn7 (int i)
+{
+  static const char g[10] = "abcdefghij";
+  return g[i];
+}
+
+extern inline int
+fn8 (void)
+{
+  return a;
+}
+
+extern inline int
+fn9 (void)
+{
+  return b;
+}
+
+extern inline int
+fn10 (void)
+{
+  return c;
+}
+
+extern inline int
+fn11 (void)
+{
+  static int d = 6;
+  return d;
+}
+
+extern inline int
+fn12 (void)
+{
+  static const int e = 6;
+  return e;
+}
+
+extern inline int
+fn13 (void)
+{
+  int f = 6;
+  return f;
+}
+
+extern inline int
+fn14 (int i)
+{
+  static const char g[10] = "abcdefghij";
+  return g[i];
+}
+
+static inline int
+fn15 (void)
+{
+  return a;
+}
+
+static inline int
+fn16 (void)
+{
+  return b;
+}
+
+static inline int
+fn17 (void)
+{
+  return c;
+}
+
+static inline int
+fn18 (void)
+{
+  static int d = 6;
+  return d;
+}
+
+static inline int
+fn19 (void)
+{
+  static const int e = 6;
+  return e;
+}
+
+static inline int
+fn20 (void)
+{
+  int f = 6;
+  return f;
+}
+
+static inline int
+fn21 (int i)
+{
+  static const char g[10] = "abcdefghij";
+  return g[i];
+}
diff --git a/gcc/testsuite/gcc.dg/inline-27.c b/gcc/testsuite/gcc.dg/inline-27.c
new file mode 100644 (file)
index 0000000..0ecfbcf
--- /dev/null
@@ -0,0 +1,145 @@
+/* PR c/35017 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } */
+
+static int a = 6;
+static const int b = 6;
+int c = 6;
+
+inline int
+fn1 (void)
+{
+  return a;
+}
+
+inline int
+fn2 (void)
+{
+  return b;
+}
+
+inline int
+fn3 (void)
+{
+  return c;
+}
+
+inline int
+fn4 (void)
+{
+  static int d = 6;
+  return d;
+}
+
+inline int
+fn5 (void)
+{
+  static const int e = 6;
+  return e;
+}
+
+inline int
+fn6 (void)
+{
+  int f = 6;
+  return f;
+}
+
+inline int
+fn7 (int i)
+{
+  static const char g[10] = "abcdefghij";
+  return g[i];
+}
+
+extern inline int
+fn8 (void)
+{
+  return a;            /* { dg-warning "used in inline" } */
+}
+
+extern inline int
+fn9 (void)
+{
+  return b;            /* { dg-warning "used in inline" } */
+}
+
+extern inline int
+fn10 (void)
+{
+  return c;
+}
+
+extern inline int
+fn11 (void)
+{
+  static int d = 6;    /* { dg-warning "declared in inline" } */
+  return d;
+}
+
+extern inline int
+fn12 (void)
+{
+  static const int e = 6;
+  return e;
+}
+
+extern inline int
+fn13 (void)
+{
+  int f = 6;
+  return f;
+}
+
+extern inline int
+fn14 (int i)
+{
+  static const char g[10] = "abcdefghij";
+  return g[i];
+}
+
+static inline int
+fn15 (void)
+{
+  return a;
+}
+
+static inline int
+fn16 (void)
+{
+  return b;
+}
+
+static inline int
+fn17 (void)
+{
+  return c;
+}
+
+static inline int
+fn18 (void)
+{
+  static int d = 6;
+  return d;
+}
+
+static inline int
+fn19 (void)
+{
+  static const int e = 6;
+  return e;
+}
+
+static inline int
+fn20 (void)
+{
+  int f = 6;
+  return f;
+}
+
+static inline int
+fn21 (int i)
+{
+  static const char g[10] = "abcdefghij";
+  return g[i];
+}