From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17416 invoked by alias); 14 Nov 2009 20:20:54 -0000 Received: (qmail 17407 invoked by uid 22791); 14 Nov 2009 20:20:53 -0000 X-SWARE-Spam-Status: No, hits=-0.5 required=5.0 tests=AWL,BAYES_00,DNS_FROM_RFC_BOGUSMX X-Spam-Check-By: sourceware.org Received: from sebabeach.org (HELO sebabeach.org) (64.165.110.50) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 14 Nov 2009 20:19:47 +0000 Received: by sebabeach.org (Postfix, from userid 500) id 6A5FD6E3D9; Sat, 14 Nov 2009 12:19:45 -0800 (PST) From: Doug Evans To: cgen@sourceware.org Subject: [commit] flag non-void expressions used in void contexts as errors Message-Id: <20091114201945.6A5FD6E3D9@sebabeach.org> Date: Sat, 14 Nov 2009 20:20:00 -0000 X-IsSubscribed: yes Mailing-List: contact cgen-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cgen-owner@sourceware.org X-SW-Source: 2009-q4/txt/msg00038.txt.bz2 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 * 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"