public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-2773] c: fix uninitialized c_expr::m_decimal [PR106830]
@ 2022-09-22 12:36 David Malcolm
  0 siblings, 0 replies; only message in thread
From: David Malcolm @ 2022-09-22 12:36 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:86254629b636db579616befde49022f098af8148

commit r13-2773-g86254629b636db579616befde49022f098af8148
Author: David Malcolm <dmalcolm@redhat.com>
Date:   Thu Sep 22 08:35:26 2022 -0400

    c: fix uninitialized c_expr::m_decimal [PR106830]
    
    I added c_expr::m_decimal in r13-2386-gbedfca647a9e9c1a as part of the
    implementation of -Wxor-used-as-pow, but I missed various places where
    the field needed to be initialized.
    
    Fixed thusly.
    
    gcc/c-family/ChangeLog:
            PR c/106830
            * c-warn.cc (check_for_xor_used_as_pow): Don't try checking
            values that don't fit in uhwi.
    
    gcc/c/ChangeLog:
            PR c/106830
            * c-parser.cc (c_parser_initelt): Initialize m_decimal.
            (c_parser_cast_expression): Likewise.
            (c_parser_alignof_expression): Likewise.
            (c_parser_postfix_expression_after_paren_type): Likewise.
            (c_parser_postfix_expression_after_primary): Likewise.
            (c_parser_expression): Likewise.
            (c_parser_omp_variable_list): Likewise.
            (c_parser_transaction_expression): Likewise.
            * c-tree.h (c_expr::set_error): Likewise.
            * c-typeck.cc (c_expr_sizeof_expr): Likewise.
            (parser_build_unary_op): Likewise.
            (parser_build_binary_op): Likewise.
            (digest_init): Likewise.
            (pop_init_level): Likewise.
            * gimple-parser.cc (c_parser_gimple_call_internal): Likewise.
    
    gcc/testsuite/ChangeLog:
            PR c/106830
            * gcc.dg/Wxor-used-as-pow-pr106830.c: New test.
    
    Signed-off-by: David Malcolm <dmalcolm@redhat.com>

Diff:
---
 gcc/c-family/c-warn.cc                           |  9 +++------
 gcc/c/c-parser.cc                                | 12 ++++++++++++
 gcc/c/c-tree.h                                   |  3 ++-
 gcc/c/c-typeck.cc                                |  7 +++++++
 gcc/c/gimple-parser.cc                           |  5 +++++
 gcc/testsuite/gcc.dg/Wxor-used-as-pow-pr106830.c |  6 ++++++
 6 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc
index ed79cc3ca40..6742f447ff5 100644
--- a/gcc/c-family/c-warn.cc
+++ b/gcc/c-family/c-warn.cc
@@ -3809,12 +3809,9 @@ check_for_xor_used_as_pow (location_t lhs_loc, tree lhs_val,
 			   location_t operator_loc,
 			   tree rhs_val)
 {
-  /* Only complain if both args are non-negative integer constants.  */
-  if (!(TREE_CODE (lhs_val) == INTEGER_CST
-	&& tree_int_cst_sgn (lhs_val) >= 0))
-    return;
-  if (!(TREE_CODE (rhs_val) == INTEGER_CST
-	&& tree_int_cst_sgn (rhs_val) >= 0))
+  /* Only complain if both args are non-negative integer constants that fit
+     in uhwi.  */
+  if (!tree_fits_uhwi_p (lhs_val) || !tree_fits_uhwi_p (rhs_val))
     return;
 
   /* Only complain if the LHS is 2 or 10.  */
diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index d134448196e..bce79d3e61a 100644
--- a/gcc/c/c-parser.cc
+++ b/gcc/c/c-parser.cc
@@ -5464,6 +5464,7 @@ c_parser_initelt (c_parser *parser, struct obstack * braced_init_obstack)
 		    = objc_build_message_expr (rec, args);
 		  mexpr.original_code = ERROR_MARK;
 		  mexpr.original_type = NULL;
+		  mexpr.m_decimal = 0;
 		  /* Now parse and process the remainder of the
 		     initializer, starting with this message
 		     expression as a primary-expression.  */
@@ -8146,6 +8147,7 @@ c_parser_cast_expression (c_parser *parser, struct c_expr *after)
 	set_c_expr_source_range (&ret, cast_loc, expr.get_finish ());
       ret.original_code = ERROR_MARK;
       ret.original_type = NULL;
+      ret.m_decimal = 0;
       return ret;
     }
   else
@@ -8464,6 +8466,7 @@ c_parser_alignof_expression (c_parser *parser)
       ret.original_code = ERROR_MARK;
       ret.original_type = NULL;
       set_c_expr_source_range (&ret, start_loc, end_loc);
+      ret.m_decimal = 0;
       return ret;
     }
   else
@@ -8483,6 +8486,7 @@ c_parser_alignof_expression (c_parser *parser)
       ret.original_code = ERROR_MARK;
       ret.original_type = NULL;
       set_c_expr_source_range (&ret, start_loc, end_loc);
+      ret.m_decimal = 0;
       return ret;
     }
 }
@@ -10383,6 +10387,7 @@ c_parser_postfix_expression_after_paren_type (c_parser *parser,
   expr.value = build_compound_literal (start_loc, type, init.value, non_const,
 				       alignas_align);
   set_c_expr_source_range (&expr, init.src_range);
+  expr.m_decimal = 0;
   expr.original_code = ERROR_MARK;
   expr.original_type = NULL;
   if (type != error_mark_node
@@ -10597,6 +10602,7 @@ c_parser_postfix_expression_after_primary (c_parser *parser,
 	  set_c_expr_source_range (&expr, start, finish);
 	  expr.original_code = ERROR_MARK;
 	  expr.original_type = NULL;
+	  expr.m_decimal = 0;
 	  break;
 	case CPP_OPEN_PAREN:
 	  /* Function call.  */
@@ -10645,6 +10651,7 @@ c_parser_postfix_expression_after_primary (c_parser *parser,
 	    = c_build_function_call_vec (expr_loc, arg_loc, expr.value,
 					 exprlist, origtypes);
 	  set_c_expr_source_range (&expr, start, finish);
+	  expr.m_decimal = 0;
 
 	  expr.original_code = ERROR_MARK;
 	  if (TREE_CODE (expr.value) == INTEGER_CST
@@ -10695,6 +10702,7 @@ c_parser_postfix_expression_after_primary (c_parser *parser,
 	      else
 		expr.original_type = DECL_BIT_FIELD_TYPE (field);
 	    }
+	  expr.m_decimal = 0;
 	  break;
 	case CPP_DEREF:
 	  /* Structure element reference.  */
@@ -10736,6 +10744,7 @@ c_parser_postfix_expression_after_primary (c_parser *parser,
 	      else
 		expr.original_type = DECL_BIT_FIELD_TYPE (field);
 	    }
+	  expr.m_decimal = 0;
 	  break;
 	case CPP_PLUS_PLUS:
 	  /* Postincrement.  */
@@ -10806,6 +10815,7 @@ c_parser_expression (c_parser *parser)
       expr.value = build_compound_expr (loc, expr.value, next.value);
       expr.original_code = COMPOUND_EXPR;
       expr.original_type = next.original_type;
+      expr.m_decimal = 0;
     }
   return expr;
 }
@@ -13256,6 +13266,7 @@ c_parser_omp_variable_list (c_parser *parser,
 		      t_expr.original_code = ERROR_MARK;
 		      t_expr.original_type = NULL;
 		      set_c_expr_source_range (&t_expr, op_loc, op_loc);
+		      t_expr.m_decimal = 0;
 		      t_expr = convert_lvalue_to_rvalue (op_loc, t_expr,
 							 true, false);
 		      t = build_indirect_ref (op_loc, t_expr.value, RO_ARROW);
@@ -23566,6 +23577,7 @@ c_parser_transaction_expression (c_parser *parser, enum rid keyword)
 	TRANSACTION_EXPR_RELAXED (ret.value) = 1;
       SET_EXPR_LOCATION (ret.value, loc);
       ret.original_code = TRANSACTION_EXPR;
+      ret.m_decimal = 0;
       if (!parens.require_close (parser))
 	{
 	  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h
index b4231a17859..46a3e8e9709 100644
--- a/gcc/c/c-tree.h
+++ b/gcc/c/c-tree.h
@@ -164,12 +164,13 @@ struct c_expr
   }
 
   /* Set the value to error_mark_node whilst ensuring that src_range
-     is initialized.  */
+     and m_decimal are initialized.  */
   void set_error ()
   {
     value = error_mark_node;
     src_range.m_start = UNKNOWN_LOCATION;
     src_range.m_finish = UNKNOWN_LOCATION;
+    m_decimal = 0;
   }
 };
 
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index 33d1e8439db..b4ef090836d 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -2994,6 +2994,7 @@ c_expr_sizeof_expr (location_t loc, struct c_expr expr)
       ret.value = error_mark_node;
       ret.original_code = ERROR_MARK;
       ret.original_type = NULL;
+      ret.m_decimal = 0;
       pop_maybe_used (false);
     }
   else
@@ -3017,6 +3018,7 @@ c_expr_sizeof_expr (location_t loc, struct c_expr expr)
       c_last_sizeof_loc = loc;
       ret.original_code = SIZEOF_EXPR;
       ret.original_type = NULL;
+      ret.m_decimal = 0;
       if (C_TYPE_VARIABLE_SIZE (TREE_TYPE (folded_expr)))
 	{
 	  /* sizeof is evaluated when given a vla (C99 6.5.3.4p2).  */
@@ -3047,6 +3049,7 @@ c_expr_sizeof_type (location_t loc, struct c_type_name *t)
   c_last_sizeof_loc = loc;
   ret.original_code = SIZEOF_EXPR;
   ret.original_type = NULL;
+  ret.m_decimal = 0;
   if (type == error_mark_node)
     {
       ret.value = error_mark_node;
@@ -3782,6 +3785,7 @@ parser_build_unary_op (location_t loc, enum tree_code code, struct c_expr arg)
 
   result.original_code = code;
   result.original_type = NULL;
+  result.m_decimal = 0;
 
   if (reject_gcc_builtin (arg.value))
     {
@@ -3844,6 +3848,7 @@ parser_build_binary_op (location_t location, enum tree_code code,
 				  arg1.value, arg2.value, true);
   result.original_code = code;
   result.original_type = NULL;
+  result.m_decimal = 0;
 
   if (TREE_CODE (result.value) == ERROR_MARK)
     {
@@ -8072,6 +8077,7 @@ digest_init (location_t init_loc, tree type, tree init, tree origtype,
 	  expr.value = inside_init;
 	  expr.original_code = (strict_string ? STRING_CST : ERROR_MARK);
 	  expr.original_type = NULL;
+	  expr.m_decimal = 0;
 	  maybe_warn_string_init (init_loc, type, expr);
 
 	  if (TYPE_DOMAIN (type) && !TYPE_MAX_VALUE (TYPE_DOMAIN (type)))
@@ -8936,6 +8942,7 @@ pop_init_level (location_t loc, int implicit,
   ret.value = NULL_TREE;
   ret.original_code = ERROR_MARK;
   ret.original_type = NULL;
+  ret.m_decimal = 0;
 
   if (implicit == 0)
     {
diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc
index b909eac498d..5a2da2cfa0e 100644
--- a/gcc/c/gimple-parser.cc
+++ b/gcc/c/gimple-parser.cc
@@ -1332,6 +1332,7 @@ c_parser_gimple_call_internal (gimple_parser &parser)
 	     exprlist.address ());
 	  expr.original_code = ERROR_MARK;
 	  expr.original_type = NULL;
+	  expr.m_decimal = 0;
 	}
     }
   return expr;
@@ -1751,6 +1752,7 @@ c_parser_gimple_postfix_expression_after_primary (gimple_parser &parser,
 	    finish = c_parser_tokens_buf (parser, 0)->location;
 	    expr.value = build_array_ref (op_loc, expr.value, idx);
 	    set_c_expr_source_range (&expr, start, finish);
+	    expr.m_decimal = 0;
 
 	    expr.original_code = ERROR_MARK;
 	    expr.original_type = NULL;
@@ -1774,6 +1776,7 @@ c_parser_gimple_postfix_expression_after_primary (gimple_parser &parser,
 	    expr.value = build_call_array_loc
 		(expr_loc, TREE_TYPE (TREE_TYPE (expr.value)),
 		 expr.value, exprlist.length (), exprlist.address ());
+	    expr.m_decimal = 0;
 	    expr.original_code = ERROR_MARK;
 	    expr.original_type = NULL;
 	    break;
@@ -1802,6 +1805,7 @@ c_parser_gimple_postfix_expression_after_primary (gimple_parser &parser,
 	    expr.value = build_component_ref (op_loc, expr.value, ident,
 					      comp_loc, UNKNOWN_LOCATION);
 	    set_c_expr_source_range (&expr, start, finish);
+	    expr.m_decimal = 0;
 	    expr.original_code = ERROR_MARK;
 	    if (TREE_CODE (expr.value) != COMPONENT_REF)
 	      expr.original_type = NULL;
@@ -1851,6 +1855,7 @@ c_parser_gimple_postfix_expression_after_primary (gimple_parser &parser,
 					      ident, comp_loc,
 					      expr.get_location ());
 	    set_c_expr_source_range (&expr, start, finish);
+	    expr.m_decimal = 0;
 	    expr.original_code = ERROR_MARK;
 	    if (TREE_CODE (expr.value) != COMPONENT_REF)
 	      expr.original_type = NULL;
diff --git a/gcc/testsuite/gcc.dg/Wxor-used-as-pow-pr106830.c b/gcc/testsuite/gcc.dg/Wxor-used-as-pow-pr106830.c
new file mode 100644
index 00000000000..104897a5f39
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wxor-used-as-pow-pr106830.c
@@ -0,0 +1,6 @@
+/* { dg-require-effective-target int128 }
+   { dg-options "-Wno-pedantic" }  */
+
+void foo0_u16_0() {
+  (__int128)(18302628885633695743 << 4) ^ 0; /* { dg-warning "integer constant is so large that it is unsigned" } */
+}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-09-22 12:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-22 12:36 [gcc r13-2773] c: fix uninitialized c_expr::m_decimal [PR106830] David Malcolm

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).