diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2017-01-04 05:45:33 +0100 |
|---|---|---|
| committer | Christopher Li <sparse@chrisli.org> | 2017-02-13 09:34:45 +0800 |
| commit | c0ad591813d823176e71e18704461e9e7f8e9af5 (patch) | |
| tree | 224fd92d437e9ae6074678a646c1d47be763381f | |
| parent | 5636cd5cbf816f30ee57d580ec4debd8e0bd7581 (diff) | |
| download | sparse-dev-c0ad591813d823176e71e18704461e9e7f8e9af5.tar.gz | |
fix value of label statement
Normaly a label statement is not also an expression but it could be
in GCC's statement expression like : ({ ...; label: <expression>; })
Currently, during linearization sparse discards the return value
of the linearization of the label's sub-statement, thus also
discarding the value of such statement-expressions.
Trivialy fix this by not discarding the return value but returning
it instead, like other statements that also are an expression and
thus have a value.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Signed-off-by: Christopher Li <sparse@chrisli.org>
| -rw-r--r-- | linearize.c | 3 | ||||
| -rw-r--r-- | validation/label-expr.c | 17 |
2 files changed, 18 insertions, 2 deletions
diff --git a/linearize.c b/linearize.c index 66b77c8e..c7e2cafd 100644 --- a/linearize.c +++ b/linearize.c @@ -2035,8 +2035,7 @@ pseudo_t linearize_statement(struct entrypoint *ep, struct statement *stmt) if (label->used) { add_label(ep, label); } - linearize_statement(ep, stmt->label_statement); - break; + return linearize_statement(ep, stmt->label_statement); } case STMT_GOTO: { diff --git a/validation/label-expr.c b/validation/label-expr.c new file mode 100644 index 00000000..e578ed00 --- /dev/null +++ b/validation/label-expr.c @@ -0,0 +1,17 @@ +int foo(void); +int foo(void) +{ + int r; + + r = ({ label: 1; }); + return r; +} + +/* + * check-name: label-expr + * check-command: test-linearize $file + * check-output-ignore + * + * check-output-excludes: ret\\.32\$ + * check-output-contains: ret\\.32 *\\$1 + */ |
