public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/redhat/heads/gcc-9-branch)] Fix handling of overflow in C casts in integer constant expressions (PR c/93241).
@ 2020-01-23 10:18 Jakub Jelinek
  0 siblings, 0 replies; 2+ messages in thread
From: Jakub Jelinek @ 2020-01-23 10:18 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:d5e8a72f8b0f0ef11da4d6eabfe7ff5556623291

commit d5e8a72f8b0f0ef11da4d6eabfe7ff5556623291
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Tue Jan 14 00:13:21 2020 +0000

    Fix handling of overflow in C casts in integer constant expressions (PR c/93241).
    
    Bug 93241 reports a case where certain C expressions involving casts,
    that would not be valid in an evaluated part of an integer constant
    expression (because of e.g. involving integer overflow), are wrongly
    rejected in an unevaluated part of an integer constant expression even
    though all the operands and operations are ones that are valid in that
    context.  This is a rejects-valid regression in GCC 4.5 and later
    relative to 4.4 (for some testcases; the one in the bug uses
    _Static_assert which isn't supported in those older releases).
    
    The rule in the C front end is that an expression with those
    properties (valid in an unevaluated part of an integer constant
    expression but not an evaluated part) must be represented either as an
    INTEGER_CST with TREE_OVERFLOW set or as a C_MAYBE_CONST_EXPR with
    C_MAYBE_CONST_EXPR_INT_OPERANDS set.  This patch fixes build_c_cast to
    check for that case and call note_integer_operands as needed.
    
    Bootstrapped with no regressions for x86_64-pc-linux-gnu.
    
    	PR c/93241
    gcc/c:
    	* c-typeck.c (build_c_cast): Check for expressions with integer
    	operands that can occur in an unevaluated part of an integer
    	constant expression and call note_integer_operands as needed.
    
    gcc/testsuite:
    	* gcc.dg/c11-static-assert-10.c, gcc.dg/c99-const-expr-15.c: New
    	tests.
    
    (cherry picked from commit 3d77686d2eddf76d3498169d0ca5653db45a8662)

Diff:
---
 gcc/c/ChangeLog                             | 10 ++++++++++
 gcc/c/c-typeck.c                            | 10 ++++++++++
 gcc/testsuite/ChangeLog                     |  9 +++++++++
 gcc/testsuite/gcc.dg/c11-static-assert-10.c |  9 +++++++++
 gcc/testsuite/gcc.dg/c99-const-expr-15.c    |  9 +++++++++
 5 files changed, 47 insertions(+)

diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 67f52dd..3b9e284 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,13 @@
+2020-01-13  Joseph Myers  <joseph@codesourcery.com>
+
+	Backport from mainline:
+	2020-01-13  Joseph Myers  <joseph@codesourcery.com>
+
+	PR c/93241
+	* c-typeck.c (build_c_cast): Check for expressions with integer
+	operands that can occur in an unevaluated part of an integer
+	constant expression and call note_integer_operands as needed.
+
 2019-12-20  Jakub Jelinek  <jakub@redhat.com>
 
 	Backported from mainline
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index be12a0a..5d5231d 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -5702,6 +5702,8 @@ build_c_cast (location_t loc, tree type, tree expr)
 {
   tree value;
 
+  bool int_operands = EXPR_INT_CONST_OPERANDS (expr);
+
   if (TREE_CODE (expr) == EXCESS_PRECISION_EXPR)
     expr = TREE_OPERAND (expr, 0);
 
@@ -5936,6 +5938,14 @@ build_c_cast (location_t loc, tree type, tree expr)
 	       || TREE_CODE (expr) == COMPLEX_CST)))
       value = build1 (NOP_EXPR, type, value);
 
+  /* If the expression has integer operands and so can occur in an
+     unevaluated part of an integer constant expression, ensure the
+     return value reflects this.  */
+  if (int_operands
+      && INTEGRAL_TYPE_P (type)
+      && !EXPR_INT_CONST_OPERANDS (value))
+    value = note_integer_operands (value);
+
   protected_set_expr_location (value, loc);
   return value;
 }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ab1e3b4..3999bf3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,15 @@
 2020-01-13  Joseph Myers  <joseph@codesourcery.com>
 
 	Backport from mainline:
+	2020-01-13  Joseph Myers  <joseph@codesourcery.com>
+
+	PR c/93241
+	* gcc.dg/c11-static-assert-10.c, gcc.dg/c99-const-expr-15.c: New
+	tests.
+
+2020-01-13  Joseph Myers  <joseph@codesourcery.com>
+
+	Backport from mainline:
 	2019-12-09  Joseph Myers  <joseph@codesourcery.com>
 
 	PR middle-end/91226
diff --git a/gcc/testsuite/gcc.dg/c11-static-assert-10.c b/gcc/testsuite/gcc.dg/c11-static-assert-10.c
new file mode 100644
index 0000000..2fe210b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c11-static-assert-10.c
@@ -0,0 +1,9 @@
+/* Test for constant expressions: casts with integer overflow.  PR
+   c/93241.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic-errors" } */
+
+#include <limits.h>
+
+_Static_assert (0 ? (_Bool) (INT_MAX + 1) : 1, "");
+_Static_assert (0 ? (short) ((INT_MAX + 1) != 0) : 1, "");
diff --git a/gcc/testsuite/gcc.dg/c99-const-expr-15.c b/gcc/testsuite/gcc.dg/c99-const-expr-15.c
new file mode 100644
index 0000000..b1744b6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c99-const-expr-15.c
@@ -0,0 +1,9 @@
+/* Test for constant expressions: casts with integer overflow.  PR
+   c/93241.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
+
+#include <limits.h>
+
+struct s { int a : (0 ? (_Bool) (INT_MAX + 1) : 1); };
+struct t { int a : (0 ? (short) ((INT_MAX + 1) != 0) : 1); };


^ permalink raw reply	[flat|nested] 2+ messages in thread

* [gcc(refs/vendors/redhat/heads/gcc-9-branch)] Fix handling of overflow in C casts in integer constant expressions (PR c/93241).
@ 2020-01-23 10:21 Jakub Jelinek
  0 siblings, 0 replies; 2+ messages in thread
From: Jakub Jelinek @ 2020-01-23 10:21 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:2638a44bbe43089f9fc00251592895584314a4b2

commit 2638a44bbe43089f9fc00251592895584314a4b2
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Tue Jan 14 00:13:21 2020 +0000

    Fix handling of overflow in C casts in integer constant expressions (PR c/93241).
    
    Bug 93241 reports a case where certain C expressions involving casts,
    that would not be valid in an evaluated part of an integer constant
    expression (because of e.g. involving integer overflow), are wrongly
    rejected in an unevaluated part of an integer constant expression even
    though all the operands and operations are ones that are valid in that
    context.  This is a rejects-valid regression in GCC 4.5 and later
    relative to 4.4 (for some testcases; the one in the bug uses
    _Static_assert which isn't supported in those older releases).
    
    The rule in the C front end is that an expression with those
    properties (valid in an unevaluated part of an integer constant
    expression but not an evaluated part) must be represented either as an
    INTEGER_CST with TREE_OVERFLOW set or as a C_MAYBE_CONST_EXPR with
    C_MAYBE_CONST_EXPR_INT_OPERANDS set.  This patch fixes build_c_cast to
    check for that case and call note_integer_operands as needed.
    
    Bootstrapped with no regressions for x86_64-pc-linux-gnu.
    
    	PR c/93241
    gcc/c:
    	* c-typeck.c (build_c_cast): Check for expressions with integer
    	operands that can occur in an unevaluated part of an integer
    	constant expression and call note_integer_operands as needed.
    
    gcc/testsuite:
    	* gcc.dg/c11-static-assert-10.c, gcc.dg/c99-const-expr-15.c: New
    	tests.
    
    (cherry picked from commit 3d77686d2eddf76d3498169d0ca5653db45a8662)

Diff:
---
 gcc/c/ChangeLog                             | 10 ++++++++++
 gcc/c/c-typeck.c                            | 10 ++++++++++
 gcc/testsuite/ChangeLog                     |  9 +++++++++
 gcc/testsuite/gcc.dg/c11-static-assert-10.c |  9 +++++++++
 gcc/testsuite/gcc.dg/c99-const-expr-15.c    |  9 +++++++++
 5 files changed, 47 insertions(+)

diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 67f52dd..3b9e284 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,13 @@
+2020-01-13  Joseph Myers  <joseph@codesourcery.com>
+
+	Backport from mainline:
+	2020-01-13  Joseph Myers  <joseph@codesourcery.com>
+
+	PR c/93241
+	* c-typeck.c (build_c_cast): Check for expressions with integer
+	operands that can occur in an unevaluated part of an integer
+	constant expression and call note_integer_operands as needed.
+
 2019-12-20  Jakub Jelinek  <jakub@redhat.com>
 
 	Backported from mainline
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index be12a0a..5d5231d 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -5702,6 +5702,8 @@ build_c_cast (location_t loc, tree type, tree expr)
 {
   tree value;
 
+  bool int_operands = EXPR_INT_CONST_OPERANDS (expr);
+
   if (TREE_CODE (expr) == EXCESS_PRECISION_EXPR)
     expr = TREE_OPERAND (expr, 0);
 
@@ -5936,6 +5938,14 @@ build_c_cast (location_t loc, tree type, tree expr)
 	       || TREE_CODE (expr) == COMPLEX_CST)))
       value = build1 (NOP_EXPR, type, value);
 
+  /* If the expression has integer operands and so can occur in an
+     unevaluated part of an integer constant expression, ensure the
+     return value reflects this.  */
+  if (int_operands
+      && INTEGRAL_TYPE_P (type)
+      && !EXPR_INT_CONST_OPERANDS (value))
+    value = note_integer_operands (value);
+
   protected_set_expr_location (value, loc);
   return value;
 }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e0c6f21..f5c1c20 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,15 @@
 2020-01-13  Joseph Myers  <joseph@codesourcery.com>
 
 	Backport from mainline:
+	2020-01-13  Joseph Myers  <joseph@codesourcery.com>
+
+	PR c/93241
+	* gcc.dg/c11-static-assert-10.c, gcc.dg/c99-const-expr-15.c: New
+	tests.
+
+2020-01-13  Joseph Myers  <joseph@codesourcery.com>
+
+	Backport from mainline:
 	2019-12-09  Joseph Myers  <joseph@codesourcery.com>
 
 	PR middle-end/91226
diff --git a/gcc/testsuite/gcc.dg/c11-static-assert-10.c b/gcc/testsuite/gcc.dg/c11-static-assert-10.c
new file mode 100644
index 0000000..2fe210b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c11-static-assert-10.c
@@ -0,0 +1,9 @@
+/* Test for constant expressions: casts with integer overflow.  PR
+   c/93241.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic-errors" } */
+
+#include <limits.h>
+
+_Static_assert (0 ? (_Bool) (INT_MAX + 1) : 1, "");
+_Static_assert (0 ? (short) ((INT_MAX + 1) != 0) : 1, "");
diff --git a/gcc/testsuite/gcc.dg/c99-const-expr-15.c b/gcc/testsuite/gcc.dg/c99-const-expr-15.c
new file mode 100644
index 0000000..b1744b6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c99-const-expr-15.c
@@ -0,0 +1,9 @@
+/* Test for constant expressions: casts with integer overflow.  PR
+   c/93241.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
+
+#include <limits.h>
+
+struct s { int a : (0 ? (_Bool) (INT_MAX + 1) : 1); };
+struct t { int a : (0 ? (short) ((INT_MAX + 1) != 0) : 1); };


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-01-23 10:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-23 10:18 [gcc(refs/vendors/redhat/heads/gcc-9-branch)] Fix handling of overflow in C casts in integer constant expressions (PR c/93241) Jakub Jelinek
2020-01-23 10:21 Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).