* [commit] flag non-void expressions used in void contexts as errors
@ 2009-11-14 20:20 Doug Evans
0 siblings, 0 replies; only message in thread
From: Doug Evans @ 2009-11-14 20:20 UTC (permalink / raw)
To: cgen
Hi.
I checked this in.
[flagging other similar kinds of errors is left for later]
Tested with "gen-all all", no differences in generated code
(after I fixed several problems in xc16x.cpu).
2009-11-14 Doug Evans <dje@sebabeach.org>
* rtl-traverse.scm (/rtx-canon): Flag an error for non-void
expressions used in a void context.
Index: rtl-traverse.scm
===================================================================
RCS file: /cvs/src/src/cgen/rtl-traverse.scm,v
retrieving revision 1.19
diff -u -p -r1.19 rtl-traverse.scm
--- rtl-traverse.scm 5 Nov 2009 16:55:33 -0000 1.19
+++ rtl-traverse.scm 14 Nov 2009 20:09:19 -0000
@@ -1198,8 +1198,16 @@
expr parent-expr op-num))
(let ((rtx-obj (rtx-lookup rtx-name)))
(if rtx-obj
- (/rtx-canon-expr rtx-obj mode rtx-name (cdr expr)
- parent-expr op-num cstate env depth)
+ (let ((canon-expr
+ (/rtx-canon-expr rtx-obj mode rtx-name (cdr expr)
+ parent-expr op-num cstate env depth)))
+ (if (eq? mode 'VOID)
+ (let ((expr-mode (or (rtx-result-mode rtx-obj)
+ (rtx-mode canon-expr))))
+ (if (not (eq? expr-mode 'VOID))
+ (/rtx-canon-error cstate "non-VOID-mode expression"
+ expr parent-expr op-num))))
+ canon-expr)
(let ((rtx-obj (/rtx-macro-lookup rtx-name)))
(if rtx-obj
(/rtx-canon (/rtx-macro-expand expr rtx-evaluator)
@@ -1211,33 +1219,37 @@
;; See if it's an operand shortcut.
(if (memq expected '(RTX SETRTX))
- (cond ((symbol? expr)
- (cond ((current-op-lookup expr (/cstate-isas cstate))
- => (lambda (op)
- ;; NOTE: We can't simply call
- ;; op:mode-name here, we need the real
- ;; mode, not (potentially) DFLT.
- ;; See /rtx-pick-op-mode.
- (rtx-make-operand (/rtx-pick-op-mode cstate mode 'DFLT op parent-expr)
- expr)))
- ((rtx-temp-lookup env expr)
- => (lambda (tmp)
- (rtx-make-local (obj:name (rtx-temp-mode tmp)) expr)))
- ((current-ifld-lookup expr)
- => (lambda (f)
- (rtx-make-ifield (obj:name (ifld-mode f)) expr)))
- ((enum-lookup-val expr)
- ;; ??? If enums could have modes other than INT,
- ;; we'd want to propagate that mode here.
- (rtx-make-enum 'INT expr))
- (else
- (/rtx-canon-error cstate "unknown operand"
- expr parent-expr op-num))))
- ((integer? expr)
- (rtx-make-const 'INT expr))
- (else
- (/rtx-canon-error cstate "unexpected operand"
- expr parent-expr op-num)))
+ (begin
+ (if (eq? mode 'VOID)
+ (/rtx-canon-error cstate "non-VOID-mode expression"
+ expr parent-expr op-num))
+ (cond ((symbol? expr)
+ (cond ((current-op-lookup expr (/cstate-isas cstate))
+ => (lambda (op)
+ ;; NOTE: We can't simply call
+ ;; op:mode-name here, we need the real
+ ;; mode, not (potentially) DFLT.
+ ;; See /rtx-pick-op-mode.
+ (rtx-make-operand (/rtx-pick-op-mode cstate mode 'DFLT op parent-expr)
+ expr)))
+ ((rtx-temp-lookup env expr)
+ => (lambda (tmp)
+ (rtx-make-local (obj:name (rtx-temp-mode tmp)) expr)))
+ ((current-ifld-lookup expr)
+ => (lambda (f)
+ (rtx-make-ifield (obj:name (ifld-mode f)) expr)))
+ ((enum-lookup-val expr)
+ ;; ??? If enums could have modes other than INT,
+ ;; we'd want to propagate that mode here.
+ (rtx-make-enum 'INT expr))
+ (else
+ (/rtx-canon-error cstate "unknown operand"
+ expr parent-expr op-num))))
+ ((integer? expr)
+ (rtx-make-const 'INT expr))
+ (else
+ (/rtx-canon-error cstate "unexpected operand"
+ expr parent-expr op-num))))
;; Not expecting RTX or SETRTX.
(/rtx-canon-error cstate "unexpected operand"
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-11-14 20:20 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-14 20:20 [commit] flag non-void expressions used in void contexts as errors Doug Evans
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).