aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenth@gcc.gnu.org>2005-05-17 09:00:03 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2005-05-17 09:00:03 +0000
commitfb664a2cba8002496836cffe6381ad3f834df6cc (patch)
tree08aa63c8607e392e807a4a279e038b70ec7fb28b /gcc/builtins.c
parent64e6863ed571bbd89eb7a65e3727a2a4ecc1ea27 (diff)
downloadgcc-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.c13
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