diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2011-10-09 23:20:39 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2011-10-09 23:20:39 +0000 |
commit | 90454da1c0d74ee14a72a2c157f751de926a6ded (patch) | |
tree | 6019757ae3f0d04b80ae95e56cc4528d78e752af /gcc/cp/init.c | |
parent | 75e649f6f48d121f830f244827551618d903fd07 (diff) | |
download | gcc-90454da1c0d74ee14a72a2c157f751de926a6ded.zip gcc-90454da1c0d74ee14a72a2c157f751de926a6ded.tar.gz gcc-90454da1c0d74ee14a72a2c157f751de926a6ded.tar.bz2 |
re PR c++/38980 (missing -Wformat warning on const char format string)
/cp
2011-10-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/38980
* init.c (constant_value_1): Add bool parameter.
(decl_constant_value_safe): Add.
(integral_constant_value): Adjust.
(decl_constant_value): Adjust.
* cp-tree.h (decl_constant_value_safe): Declare.
* typeck.c (decay_conversion): Use decl_constant_value_safe.
* call.c (convert_like_real): Likewise.
/testsuite
2011-10-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/38980
* g++.dg/warn/format5.C: New.
From-SVN: r179731
Diffstat (limited to 'gcc/cp/init.c')
-rw-r--r-- | gcc/cp/init.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c index f246286..7897fff 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1794,10 +1794,11 @@ build_offset_ref (tree type, tree member, bool address_p) constant initializer, return the initializer (or, its initializers, recursively); otherwise, return DECL. If INTEGRAL_P, the initializer is only returned if DECL is an integral - constant-expression. */ + constant-expression. If RETURN_AGGREGATE_CST_OK_P, it is ok to + return an aggregate constant. */ static tree -constant_value_1 (tree decl, bool integral_p) +constant_value_1 (tree decl, bool integral_p, bool return_aggregate_cst_ok_p) { while (TREE_CODE (decl) == CONST_DECL || (integral_p @@ -1834,12 +1835,13 @@ constant_value_1 (tree decl, bool integral_p) if (!init || !TREE_TYPE (init) || !TREE_CONSTANT (init) - || (!integral_p - /* Do not return an aggregate constant (of which - string literals are a special case), as we do not - want to make inadvertent copies of such entities, - and we must be sure that their addresses are the - same everywhere. */ + || (!integral_p && !return_aggregate_cst_ok_p + /* Unless RETURN_AGGREGATE_CST_OK_P is true, do not + return an aggregate constant (of which string + literals are a special case), as we do not want + to make inadvertent copies of such entities, and + we must be sure that their addresses are the + same everywhere. */ && (TREE_CODE (init) == CONSTRUCTOR || TREE_CODE (init) == STRING_CST))) break; @@ -1856,18 +1858,28 @@ constant_value_1 (tree decl, bool integral_p) tree integral_constant_value (tree decl) { - return constant_value_1 (decl, /*integral_p=*/true); + return constant_value_1 (decl, /*integral_p=*/true, + /*return_aggregate_cst_ok_p=*/false); } /* A more relaxed version of integral_constant_value, used by the - common C/C++ code and by the C++ front end for optimization - purposes. */ + common C/C++ code. */ tree decl_constant_value (tree decl) { - return constant_value_1 (decl, - /*integral_p=*/processing_template_decl); + return constant_value_1 (decl, /*integral_p=*/processing_template_decl, + /*return_aggregate_cst_ok_p=*/true); +} + +/* A version of integral_constant_value used by the C++ front end for + optimization purposes. */ + +tree +decl_constant_value_safe (tree decl) +{ + return constant_value_1 (decl, /*integral_p=*/processing_template_decl, + /*return_aggregate_cst_ok_p=*/false); } /* Common subroutines of build_new and build_vec_delete. */ |