From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 121321 invoked by alias); 22 Apr 2017 17:50:10 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 121303 invoked by uid 89); 22 Apr 2017 17:50:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS,URIBL_RED autolearn=ham version=3.3.2 spammy=fi, HTo:U*ro, letter X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 22 Apr 2017 17:50:05 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-MBX-04.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1d1zAZ-0001rt-4r from Tom_deVries@mentor.com ; Sat, 22 Apr 2017 10:50:03 -0700 Received: from [127.0.0.1] (137.202.0.87) by SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) with Microsoft SMTP Server (TLS) id 15.0.1210.3; Sat, 22 Apr 2017 18:49:58 +0100 To: Mike Stump , Rainer Orth CC: GCC Patches , Jakub Jelinek From: Tom de Vries Subject: [RFC, testsuite] Add dg-save-linenr Message-ID: Date: Sat, 22 Apr 2017 20:47:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------C6F38BD505CD12B2C6EAA553" X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) X-SW-Source: 2017-04/txt/msg00975.txt.bz2 --------------C6F38BD505CD12B2C6EAA553 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1406 Hi, there are currently two types of line number supported in dg-{error,warning,message,bogus} directives: absolute and relative. With an absolute line number, it's immediately clear what line number is meant, but when a line is added at the start of the file, the line number needs to be updated. With a relative line number, that problem is solved, but when relative line numbers become large, it becomes less clear what line it refers to, and when adding a line inbetween the directive using the relative line number and the line it refers to, the relative line number still needs to be updated. This patch adds a directive dg-save-linenr with argument varname, that saves the line number of the directive in a variable varname, which can be used as line number in dg directives. Testing status: - tested updated test-case objc.dg/try-catch-12.m - ran tree-ssa.exp RFC: - good idea? - naming of directive dg-save-linenr (dg-linenr, dg-save-line-nr, dg-save-lineno, dg-save-line-number, etc) - allowed variable names (currently: start with letter, followed by alphanumerical or underscore) - should we use a prefix symbol or some such when the variable is used (and possibly defined as well)? F.i.: /* { dg-save-linenr %some_func_decl } *./ /* { dg-message "but argument is of type" "" { target *-*-* } %some_func_decl } */ - error message formulation Thanks, - Tom --------------C6F38BD505CD12B2C6EAA553 Content-Type: text/x-patch; name="0001-Add-dg-save-linenr.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="0001-Add-dg-save-linenr.patch" Content-length: 5284 Add dg-save-linenr 2017-04-22 Tom de Vries * lib/gcc-dg.exp (cleanup-after-saved-dg-test): Cleanup line number variables. (dg-save-linenr): New proc. (process-message): Handle line number variables. * objc.dg/try-catch-12.m: Use dg-save-linenr. --- gcc/testsuite/lib/gcc-dg.exp | 50 ++++++++++++++++++++++++++++++++---- gcc/testsuite/objc.dg/try-catch-12.m | 8 +++--- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp index 83c38cf..555e083 100644 --- a/gcc/testsuite/lib/gcc-dg.exp +++ b/gcc/testsuite/lib/gcc-dg.exp @@ -902,6 +902,7 @@ if { [info procs saved-dg-test] == [list] } { global keep_saved_temps_suffixes global multiline_expected_outputs global freeform_regexps + global save_linenr_varnames set additional_files "" set additional_sources "" @@ -928,6 +929,13 @@ if { [info procs saved-dg-test] == [list] } { } set multiline_expected_outputs [] set freeform_regexps [] + + if { [info exists save_linenr_varnames] } { + foreach varname $save_linenr_varnames { + eval unset $varname + } + unset save_linenr_varnames + } } proc dg-test { args } { @@ -979,6 +987,24 @@ if { [info procs saved-dg-error] == [list] \ } } +proc dg-save-linenr { linenr varname } { + set org_varname $varname + set varname "saved_linenr_$varname" + eval global $varname + eval set var_defined [info exists $varname] + if { $var_defined } { + eval set deflinenr \$$varname + error "dg-save-linenr var $org_varname defined at line $linenr, but previously defined at line $deflinenr" + return + } + eval set $varname $linenr + if { [info exists save_linenr_varnames] } { + lappend save_linenr_varnames $varname + } else { + set save_linenr_varnames [list $varname] + } +} + # Modify the regular expression saved by a DejaGnu message directive to # include a prefix and to force the expression to match a single line. # MSGPROC is the procedure to call. @@ -988,11 +1014,25 @@ if { [info procs saved-dg-error] == [list] \ proc process-message { msgproc msgprefix dgargs } { upvar dg-messages dg-messages - # Handle relative line specification, .+1 or .-1 etc. - if { [llength $dgargs] == 5 - && [regsub "^\.\[+-\](\[0-9\]+)$" [lindex $dgargs 4] "\\1" num] } { - set num [expr [lindex $dgargs 0] [string index [lindex $dgargs 4] 1] $num] - set dgargs [lreplace $dgargs 4 4 $num] + if { [llength $dgargs] == 5 } { + if { [regsub "^\.\[+-\](\[0-9\]+)$" [lindex $dgargs 4] "\\1" num] } { + # Handle relative line specification, .+1 or .-1 etc. + set num [expr [lindex $dgargs 0] [string index [lindex $dgargs 4] 1] $num] + set dgargs [lreplace $dgargs 4 4 $num] + } elseif { [regsub "^(\[a-zA-Z\]\[a-zA-Z0-9_\]*)$" [lindex $dgargs 4] "\\1" varname] } { + # Handle linenr variable defined by dg-save-linenr + set org_varname $varname + set varname "saved_linenr_$varname" + eval global $varname + eval set var_defined [info exists $varname] + if { ! $var_defined } { + set linenr [expr [lindex $dgargs 0]] + error "dg-save-linenr var $org_varname used at line $linenr, but not defined" + return + } + eval set num \$$varname + set dgargs [lreplace $dgargs 4 4 $num] + } } # Process the dg- directive, including adding the regular expression diff --git a/gcc/testsuite/objc.dg/try-catch-12.m b/gcc/testsuite/objc.dg/try-catch-12.m index 61e2703..558ad02 100644 --- a/gcc/testsuite/objc.dg/try-catch-12.m +++ b/gcc/testsuite/objc.dg/try-catch-12.m @@ -9,7 +9,7 @@ - (void) testSpoon; @end -extern void some_func (int *); +extern void some_func (int *); /* { dg-save-linenr some_func_decl } */ @implementation TestMyTests - (void) testSpoon { @@ -21,7 +21,7 @@ extern void some_func (int *); typeof(i) j = 6; typeof(q) k = 66; some_func (&j); /* { dg-warning "discards .volatile. qualifier from pointer target type" } */ - /* { dg-message "but argument is of type" "" { target *-*-* } 12 } */ + /* { dg-message "but argument is of type" "" { target *-*-* } some_func_decl } */ some_func (&k); } @catch (id exc) { @@ -37,7 +37,7 @@ extern void some_func (int *); some_func (&j); /* { dg-warning "discards .volatile. qualifier from pointer target type" } */ /* The following is disabled as it is already checked above and the testsuites seems to count multiple different identical errors on the same line only once */ - /* dg-message "but argument is of type" "" { target *-*-* } 12 */ + /* dg-message "but argument is of type" "" { target *-*-* } some_func_decl */ } @catch (id exc) { @throw; @@ -51,7 +51,7 @@ extern void some_func (int *); some_func (&j); /* { dg-warning "discards .volatile. qualifier from pointer target type" } */ /* The following is disabled as it is already checked above and the testsuites seems to count multiple different identical errors on the same line only once */ - /* dg-message "but argument is of type" "" { target *-*-* } 12 */ + /* dg-message "but argument is of type" "" { target *-*-* } some_func_decl */ some_func (&k); } @catch (id exc) { --------------C6F38BD505CD12B2C6EAA553--