diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/c-decl.c | 1 | ||||
-rw-r--r-- | gcc/c-typeck.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/inline-25.c | 145 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/inline-26.c | 145 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/inline-27.c | 145 |
7 files changed, 454 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f8686f3..5c5c884 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 860b337..1af84da 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -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 " diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index fb2e47f..60b0b02 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 86bfcc7..11239a5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..8063d6c --- /dev/null +++ b/gcc/testsuite/gcc.dg/inline-25.c @@ -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 index 0000000..02f78bb --- /dev/null +++ b/gcc/testsuite/gcc.dg/inline-26.c @@ -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 index 0000000..0ecfbcf --- /dev/null +++ b/gcc/testsuite/gcc.dg/inline-27.c @@ -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]; +} |