diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c-pch.c | 7 | ||||
-rw-r--r-- | gcc/c-typeck.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wcxx-compat-14.c | 6 |
5 files changed, 40 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c21b72e..2291ec2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-06-17 Ian Lance Taylor <iant@google.com> + + * c-pch.c (get_ident): Don't set size of templ array. + (pch_init): Don't set size of partial_pch array. + + * c-typeck.c (digest_init): If -Wc++-compat, warn about using a + string constant to intialize an array whose size is the length of + the string. + 2009-06-17 Richard Guenther <rguenther@suse.de> PR tree-optimization/40389 diff --git a/gcc/c-pch.c b/gcc/c-pch.c index b4f7050..abdf4ab 100644 --- a/gcc/c-pch.c +++ b/gcc/c-pch.c @@ -1,5 +1,6 @@ /* Precompiled header implementation for the C languages. - Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008, 2009 + Free Software Foundation, Inc. This file is part of GCC. @@ -92,7 +93,7 @@ static const char * get_ident (void) { static char result[IDENT_LENGTH]; - static const char templ[IDENT_LENGTH] = "gpch.013"; + static const char templ[] = "gpch.013"; static const char c_language_chars[] = "Co+O"; memcpy (result, templ, IDENT_LENGTH); @@ -112,7 +113,7 @@ pch_init (void) FILE *f; struct c_pch_validity v; void *target_validity; - static const char partial_pch[IDENT_LENGTH] = "gpcWrite"; + static const char partial_pch[] = "gpcWrite"; #ifdef ASM_COMMENT_START if (flag_verbose_asm) diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 07d51a4..0a40a88 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -5546,16 +5546,26 @@ digest_init (location_t init_loc, tree type, tree init, tree origtype, TREE_TYPE (inside_init) = type; if (TYPE_DOMAIN (type) != 0 && TYPE_SIZE (type) != 0 - && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST + && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST) + { + unsigned HOST_WIDE_INT len = TREE_STRING_LENGTH (inside_init); + /* Subtract the size of a single (possibly wide) character because it's ok to ignore the terminating null char that is counted in the length of the constant. */ - && 0 > compare_tree_int (TYPE_SIZE_UNIT (type), - TREE_STRING_LENGTH (inside_init) - - (TYPE_PRECISION (typ1) - / BITS_PER_UNIT))) - pedwarn_init (init_loc, 0, - "initializer-string for array of chars is too long"); + if (0 > compare_tree_int (TYPE_SIZE_UNIT (type), + (len + - (TYPE_PRECISION (typ1) + / BITS_PER_UNIT)))) + pedwarn_init (init_loc, 0, + ("initializer-string for array of chars " + "is too long")); + else if (warn_cxx_compat + && 0 > compare_tree_int (TYPE_SIZE_UNIT (type), len)) + warning_at (init_loc, OPT_Wc___compat, + ("initializer-string for array chars " + "is too long for C++")); + } return inside_init; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 42ec514..3e42e51 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-06-17 Ian Lance Taylor <iant@google.com> + + * gcc.dg/Wcxx-compat-14.c: New testcase. + 2009-06-17 Aldy Hernandez <aldyh@redhat.com> * gcc.dg/func-ptr-conv-1.c: Update column info. diff --git a/gcc/testsuite/gcc.dg/Wcxx-compat-14.c b/gcc/testsuite/gcc.dg/Wcxx-compat-14.c new file mode 100644 index 0000000..2378371 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wcxx-compat-14.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-Wc++-compat" } */ + +char a1[] = "a"; +char a2[1] = "a"; /* { dg-warning "C\[+\]\[+\]" } */ +char a3[2] = "a"; |