diff options
author | Richard Guenther <rguenth@gcc.gnu.org> | 2005-05-17 09:00:03 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2005-05-17 09:00:03 +0000 |
commit | fb664a2cba8002496836cffe6381ad3f834df6cc (patch) | |
tree | 08aa63c8607e392e807a4a279e038b70ec7fb28b /gcc/builtins.c | |
parent | 64e6863ed571bbd89eb7a65e3727a2a4ecc1ea27 (diff) | |
download | gcc-fb664a2cba8002496836cffe6381ad3f834df6cc.zip gcc-fb664a2cba8002496836cffe6381ad3f834df6cc.tar.gz gcc-fb664a2cba8002496836cffe6381ad3f834df6cc.tar.bz2 |
re PR middle-end/21595 (__builtin_constant_p(&"Hello"[0]) is true for C but not for C++)
2005-05-17 Richard Guenther <rguenth@gcc.gnu.org>
PR middle-end/21595
* builtins.c (fold_builtin_constant_p): Handle
&"string cst"[0] as constant.
* g++.dg/tree-ssa/builtin1.C: New testcase.
From-SVN: r99825
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 8d4fc33..cdc5ceb 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -6338,10 +6338,17 @@ fold_builtin_constant_p (tree arglist) /* If we know this is a constant, emit the constant of one. */ if (CONSTANT_CLASS_P (arglist) || (TREE_CODE (arglist) == CONSTRUCTOR - && TREE_CONSTANT (arglist)) - || (TREE_CODE (arglist) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (arglist, 0)) == STRING_CST)) + && TREE_CONSTANT (arglist))) return integer_one_node; + if (TREE_CODE (arglist) == ADDR_EXPR) + { + tree op = TREE_OPERAND (arglist, 0); + if (TREE_CODE (op) == STRING_CST + || (TREE_CODE (op) == ARRAY_REF + && integer_zerop (TREE_OPERAND (op, 1)) + && TREE_CODE (TREE_OPERAND (op, 0)) == STRING_CST)) + return integer_one_node; + } /* If this expression has side effects, show we don't know it to be a constant. Likewise if it's a pointer or aggregate type since in |