aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2011-10-12 12:56:03 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2011-10-12 12:56:03 +0100
commita2d5091a51e15ef05478b68013ca3df36010a7a2 (patch)
treef9da918ccf98c870d0761a3947118511d0015444 /gcc
parent58e9ddb14d9930d4b9fc80549031231605f4f228 (diff)
downloadgcc-a2d5091a51e15ef05478b68013ca3df36010a7a2.zip
gcc-a2d5091a51e15ef05478b68013ca3df36010a7a2.tar.gz
gcc-a2d5091a51e15ef05478b68013ca3df36010a7a2.tar.bz2
re PR c/50565 (initializer element is not computable at load time)
PR c/50565 * convert.c (convert_to_integer): Do not narrow operands of pointer subtraction. testsuite: * gcc.c-torture/compile/pr50565-1.c, gcc.c-torture/compile/pr50565-2.c: New tests. From-SVN: r179845
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/convert.c9
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr50565-1.c4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr50565-2.c4
5 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 474bbb4..d9fac6f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-10-12 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/50565
+ * convert.c (convert_to_integer): Do not narrow operands of
+ pointer subtraction.
+
2011-10-12 Nick Clifton <nickc@redhat.com>
* config/arm/arm.h (EMIT_EABI_ATTRIBUTE): New macro. Used to
diff --git a/gcc/convert.c b/gcc/convert.c
index a647193..f04b204 100644
--- a/gcc/convert.c
+++ b/gcc/convert.c
@@ -745,6 +745,15 @@ convert_to_integer (tree type, tree expr)
tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
+ /* Do not try to narrow operands of pointer subtraction;
+ that will interfere with other folding. */
+ if (ex_form == MINUS_EXPR
+ && CONVERT_EXPR_P (arg0)
+ && CONVERT_EXPR_P (arg1)
+ && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0)))
+ && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1, 0))))
+ break;
+
if (outprec >= BITS_PER_WORD
|| TRULY_NOOP_TRUNCATION (outprec, inprec)
|| inprec > TYPE_PRECISION (TREE_TYPE (arg0))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c068492..70f89f9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2011-10-12 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/50565
+ * gcc.c-torture/compile/pr50565-1.c,
+ gcc.c-torture/compile/pr50565-2.c: New tests.
+
2011-10-11 Jason Merrill <jason@redhat.com>
PR c++/49855
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr50565-1.c b/gcc/testsuite/gcc.c-torture/compile/pr50565-1.c
new file mode 100644
index 0000000..cdaad29
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr50565-1.c
@@ -0,0 +1,4 @@
+struct s { char p[2]; };
+static struct s v;
+const int o0 = (int) ((void *) &v.p[0] - (void *) &v) + 0U;
+const int o1 = (int) ((void *) &v.p[0] - (void *) &v) + 1U;
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr50565-2.c b/gcc/testsuite/gcc.c-torture/compile/pr50565-2.c
new file mode 100644
index 0000000..2d30e88
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr50565-2.c
@@ -0,0 +1,4 @@
+struct s { char p[2]; };
+static struct s v;
+const int o0 = (int) ((void *) &v.p[0] - (void *) &v) + 0;
+const int o1 = (int) ((void *) &v.p[0] - (void *) &v) + 1;