linux-sparse.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
To: linux-sparse@vger.kernel.org
Cc: Christopher Li <sparse@chrisli.org>,
	Nicolai Stange <nicstange@gmail.com>,
	Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Subject: [PATCH v4 04/25] constexpr: examine constness of binops and alike at evaluation only
Date: Fri, 31 Mar 2017 03:44:38 +0200	[thread overview]
Message-ID: <20170331014459.9351-5-luc.vanoostenryck@gmail.com> (raw)
In-Reply-To: <20170331014459.9351-1-luc.vanoostenryck@gmail.com>

From: Nicolai Stange <nicstange@gmail.com>

Move the whole calculation of binary operations', compare and logical
expressions' constness flags to the evaluation phase such that expressions
like

  0 + __builtin_choose_expr(0, 0, 0)
  0 < __builtin_choose_expr(0, 0, 0)
  0 && __builtin_choose_expr(0, 0, 0)

can now be recognized as qualifying as integer constant expressions.

Signed-off-by: Nicolai Stange <nicstange@gmail.com>
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
 evaluate.c                   | 19 ++++++-------------
 expression.c                 |  3 ---
 validation/constexpr-binop.c | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 39 insertions(+), 16 deletions(-)
 create mode 100644 validation/constexpr-binop.c

diff --git a/evaluate.c b/evaluate.c
index 5725e898f..48530f28c 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -889,10 +889,8 @@ static struct symbol *evaluate_logical(struct expression *expr)
 
 	/* the result is int [6.5.13(3), 6.5.14(3)] */
 	expr->ctype = &int_ctype;
-	if (expr->flags) {
-		if (!(expr->left->flags & expr->right->flags & CEF_ICE))
-			expr->flags = CEF_NONE;
-	}
+	expr->flags = expr->left->flags & expr->right->flags;
+	expr->flags &= ~CEF_CONST_MASK;
 	return &int_ctype;
 }
 
@@ -903,13 +901,11 @@ static struct symbol *evaluate_binop(struct expression *expr)
 	int rclass = classify_type(expr->right->ctype, &rtype);
 	int op = expr->op;
 
-	if (expr->flags) {
-		if (!(expr->left->flags & expr->right->flags & CEF_ICE))
-			expr->flags = CEF_NONE;
-	}
-
 	/* number op number */
 	if (lclass & rclass & TYPE_NUM) {
+		expr->flags = expr->left->flags & expr->right->flags;
+		expr->flags &= ~CEF_CONST_MASK;
+
 		if ((lclass | rclass) & TYPE_FLOAT) {
 			switch (op) {
 			case '+': case '-': case '*': case '/':
@@ -1010,10 +1006,7 @@ static struct symbol *evaluate_compare(struct expression *expr)
 	struct symbol *ctype;
 	const char *typediff;
 
-	if (expr->flags) {
-		if (!(expr->left->flags & expr->right->flags & CEF_ICE))
-			expr->flags = CEF_NONE;
-	}
+	expr->flags = left->flags & right->flags & ~CEF_CONST_MASK;
 
 	/* Type types? */
 	if (is_type_type(ltype) && is_type_type(rtype))
diff --git a/expression.c b/expression.c
index 3262cf22c..b59af8886 100644
--- a/expression.c
+++ b/expression.c
@@ -146,7 +146,6 @@ static struct token *builtin_types_compatible_p_expr(struct token *token,
 {
 	struct expression *expr = alloc_expression(
 		token->pos, EXPR_COMPARE);
-	expr->flags = CEF_SET_ICE;
 	expr->op = SPECIAL_EQUAL;
 	token = token->next;
 	if (!match_op(token, '('))
@@ -758,8 +757,6 @@ static struct token *cast_expression(struct token *token, struct expression **tr
 				sparse_error(next->pos, "No right hand side of '%s'-expression", show_special(op));	\
 				break;					\
 			}						\
-			top->flags = left->flags & right->flags		\
-						& ~CEF_CONST_MASK;	\
 			top->op = op;					\
 			top->left = left;				\
 			top->right = right;				\
diff --git a/validation/constexpr-binop.c b/validation/constexpr-binop.c
new file mode 100644
index 000000000..85a88e3cd
--- /dev/null
+++ b/validation/constexpr-binop.c
@@ -0,0 +1,33 @@
+static int a[] = {
+	[0 + 0] = 0,						// OK
+	[0 + 0.] = 0,						// KO
+	[(void*)0 + 0] = 0,					// KO
+	[0 + __builtin_choose_expr(0, 0, 0)] = 0,		// OK
+	[0 + __builtin_choose_expr(0, 0., 0)] = 0,		// OK
+	[0 + __builtin_choose_expr(0, 0, 0.)] = 0,		// KO
+	[0 < 0] = 0,						// OK
+	[0 < 0.] = 0,						// KO
+	[0 < __builtin_choose_expr(0, 0, 0)] = 0,		// OK
+	[0 < __builtin_choose_expr(0, 0., 0)] = 0,		// OK
+	[0 < __builtin_choose_expr(0, 0, 0.)] = 0,		// KO
+	[0 && 0] = 0,						// OK
+	[0 && 0.] = 0,						// KO
+	[0 && __builtin_choose_expr(0, 0, 0)] = 0,		// OK
+	[0 && __builtin_choose_expr(0, 0., 0)] = 0,		// OK
+	[0 && __builtin_choose_expr(0, 0, 0.)] = 0,		// KO
+	[0 + __builtin_types_compatible_p(int, float)] = 0,	// OK
+};
+
+/*
+ * check-name: Expression constness propagation in binops and alike
+ *
+ * check-error-start
+constexpr-binop.c:3:12: error: bad constant expression
+constexpr-binop.c:4:19: error: bad integer constant expression
+constexpr-binop.c:7:12: error: bad constant expression
+constexpr-binop.c:9:12: error: bad integer constant expression
+constexpr-binop.c:12:12: error: bad integer constant expression
+constexpr-binop.c:14:12: error: bad integer constant expression
+constexpr-binop.c:17:12: error: bad integer constant expression
+ * check-error-end
+ */
-- 
2.12.0


  parent reply	other threads:[~2017-03-31  1:46 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-31  1:44 [PATCH v4 00/25] improve constexpr handling Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 01/25] constexpr: introduce additional expression constness tracking flags Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 02/25] constexpr: init flags at expression allocation Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 03/25] constexpr: examine constness of casts at evaluation only Luc Van Oostenryck
2017-03-31  1:44 ` Luc Van Oostenryck [this message]
2017-03-31  1:44 ` [PATCH v4 05/25] constexpr: examine constness of preops " Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 06/25] constexpr: examine constness of conditionals " Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 07/25] constexpr: add support for tagging arithmetic constant expressions Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 08/25] constexpr: add support for tagging address constants Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 09/25] constexpr: rename handle_simple_initializer() to handle_initializer() Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 10/25] constexpr: collect storage modifiers of initializers Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 11/25] constexpr: check static storage duration objects' intializers' constness Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 12/25] constexpr: recognize static objects as address constants Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 13/25] constexpr: recognize address constants created through casts Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 14/25] constexpr: recognize address constants created through pointer arithmetic Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 15/25] constexpr: recognize members of static compound objects as address constants Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 16/25] constexpr: recognize string literals " Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 17/25] constexpr: recognize references to labels " Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 18/25] constexpr: examine constness of __builtin_offsetof at evaluation only Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 19/25] constexpr: flag builtins constant_p, safe_p and warning as constexprs Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 20/25] constexpr: relax some constant expression rules for pointer expressions Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 21/25] constexpr: support compound literals as address constants Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 22/25] constexpr: treat comparisons between types as integer constexpr Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 23/25] return an error if too few args Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 24/25] give default return type in evaluate_call() Luc Van Oostenryck
2017-03-31  1:44 ` [PATCH v4 25/25] constexpr: flag __builtin_bswap() as constexpr Luc Van Oostenryck
2017-08-10 12:36 ` [PATCH v4 00/25] improve constexpr handling Christopher Li
2017-08-10 22:00   ` Luc Van Oostenryck
2017-08-11  1:24     ` Christopher Li
2017-08-11 11:14       ` Luc Van Oostenryck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170331014459.9351-5-luc.vanoostenryck@gmail.com \
    --to=luc.vanoostenryck@gmail.com \
    --cc=linux-sparse@vger.kernel.org \
    --cc=nicstange@gmail.com \
    --cc=sparse@chrisli.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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 NNTP newsgroup(s).