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 08/25] constexpr: add support for tagging address constants
Date: Fri, 31 Mar 2017 03:44:42 +0200 [thread overview]
Message-ID: <20170331014459.9351-9-luc.vanoostenryck@gmail.com> (raw)
In-Reply-To: <20170331014459.9351-1-luc.vanoostenryck@gmail.com>
From: Nicolai Stange <nicstange@gmail.com>
Address constants [6.6(9)] constitute one of the types of constant
expressions allowed in initializers [6.6(7)] for static storage
duration objects [6.7.8(4)].
Introduce a new flag for tagging expressions which qualify as
being an address constant.
Make sure not to carry over the address constant attribute from
subexpressions for operators that never yield address constants,
i.e. most arithmetic ones, logical ones etc.
Signed-off-by: Nicolai Stange <nicstange@gmail.com>
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
evaluate.c | 19 ++++++++++++++++++-
expression.h | 2 ++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/evaluate.c b/evaluate.c
index 6d6e462cd..68a2d5ebf 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -890,7 +890,7 @@ static struct symbol *evaluate_logical(struct expression *expr)
/* the result is int [6.5.13(3), 6.5.14(3)] */
expr->ctype = &int_ctype;
expr->flags = expr->left->flags & expr->right->flags;
- expr->flags &= ~CEF_CONST_MASK;
+ expr->flags &= ~(CEF_CONST_MASK | CEF_ADDR);
return &int_ctype;
}
@@ -1007,6 +1007,7 @@ static struct symbol *evaluate_compare(struct expression *expr)
const char *typediff;
expr->flags = left->flags & right->flags & ~CEF_CONST_MASK;
+ expr->flags &= ~CEF_ADDR;
/* Type types? */
if (is_type_type(ltype) && is_type_type(rtype))
@@ -1124,6 +1125,11 @@ static struct symbol *evaluate_conditional_expression(struct expression *expr)
expr->flags = (expr->conditional->flags & (*true)->flags &
expr->cond_false->flags & ~CEF_CONST_MASK);
+ /*
+ * A conditional operator never yields an address constant
+ * [6.6(9)].
+ */
+ expr->flags &= ~CEF_ADDR;
lclass = classify_type(ltype, <ype);
rclass = classify_type(rtype, &rtype);
@@ -1858,6 +1864,12 @@ static struct symbol *evaluate_preop(struct expression *expr)
case '!':
expr->flags = expr->unop->flags & ~CEF_CONST_MASK;
+ /*
+ * A logical negation never yields an address constant
+ * [6.6(9)].
+ */
+ expr->flags &= ~CEF_ADDR;
+
if (is_safe_type(ctype))
warning(expr->pos, "testing a 'safe expression'");
if (is_float_type(ctype)) {
@@ -2719,6 +2731,11 @@ static int cast_flags(struct expression *expr, struct expression *old)
class = classify_type(expr->ctype, &t);
if (class & TYPE_NUM) {
flags = old->flags & ~CEF_CONST_MASK;
+ /*
+ * Casts to numeric types never result in address
+ * constants [6.6(9)].
+ */
+ flags &= ~CEF_ADDR;
/*
* Cast to float type -> not an integer constant
* expression [6.6(6)].
diff --git a/expression.h b/expression.h
index 67b6a83e3..960f16005 100644
--- a/expression.h
+++ b/expression.h
@@ -97,9 +97,11 @@ enum constexpr_flag {
* A constant expression in the sense of [6.6]:
* - integer constant expression [6.6(6)]
* - arithmetic constant expression [6.6(8)]
+ * - address constant [6.6(9)]
*/
CEF_ICE = (1 << 4),
CEF_ACE = (1 << 5),
+ CEF_ADDR = (1 << 6),
/* integer constant expression => arithmetic constant expression */
CEF_SET_ICE = (CEF_ICE | CEF_ACE),
--
2.12.0
next prev 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 ` [PATCH v4 04/25] constexpr: examine constness of binops and alike " Luc Van Oostenryck
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 ` Luc Van Oostenryck [this message]
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-9-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).