From 019c559b7e7214b8016a97cf19168a26b828520a Mon Sep 17 00:00:00 2001 From: ian Date: Wed, 17 Jun 2009 13:21:23 +0000 Subject: [PATCH] ./: * 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. testsuite/: * gcc.dg/Wcxx-compat-14.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@148611 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++++++ gcc/c-pch.c | 7 ++++--- gcc/c-typeck.c | 24 +++++++++++++++++------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/Wcxx-compat-14.c | 6 ++++++ 5 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/Wcxx-compat-14.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c21b72ef7ba..2291ec21836 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-06-17 Ian Lance Taylor + + * 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 PR tree-optimization/40389 diff --git a/gcc/c-pch.c b/gcc/c-pch.c index b4f70506e40..abdf4ab4677 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 07d51a4d5d8..0a40a888d53 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 42ec5145b8e..3e42e51de70 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-06-17 Ian Lance Taylor + + * gcc.dg/Wcxx-compat-14.c: New testcase. + 2009-06-17 Aldy Hernandez * 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 00000000000..23783711be6 --- /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"; -- 2.11.0