This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, testsuite] Allow braces around relative line numbers


On 03/29/2017 12:23 AM, Jakub Jelinek wrote:
On Tue, Mar 28, 2017 at 08:27:54AM +0200, Tom de Vries wrote:
this patch fixes testsuite PR80220 - "relative line numbers don't work when
put between braces".

What is the advantage of putting the line numbers between braces?

I don't know of any advantages.

Isn't it easier to just drop those?

I've attached two patches:
- first patch implements a script
  contrib/tests-normalize-line-number.sh that removes braces around
  line numbers.
- second patch is the result of running the script.

Tested by running the patched test-cases.

Second patch OK for stage4/stage1 trunk?

[ I'm not sure if the first patch is useful enough to commit to contrib. ]

Thanks,
- Tom
Add contrib/tests-normalize-line-number.sh

2017-04-15  Tom de Vries  <tom@codesourcery.com>

	* tests-normalize-line-number.sh: New file.

---
 contrib/tests-normalize-line-number.sh | 78 ++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/contrib/tests-normalize-line-number.sh b/contrib/tests-normalize-line-number.sh
new file mode 100755
index 0000000..9ecba6a
--- /dev/null
+++ b/contrib/tests-normalize-line-number.sh
@@ -0,0 +1,78 @@
+#!/usr/bin/env python2
+
+# We hit a bug with python 3 when doing replace_in_file_p() with
+# ./libstdc++-v3/testsuite/27_io/basic_filebuf/cons/wchar_t/10132-1.cc, so let's
+# use python 2 and import the print function from python 3.
+from __future__ import print_function
+
+import os, re
+import fileinput
+
+# A non-negative number.
+number="[0-9][0-9]*"
+# Allow quotes around the number.
+number=(
+    "(?:" +
+    number + "|" +
+    '"' + number + '"' + "|" +
+    "'" + number + "'" +
+    ")"
+)
+# Directives using a line number.
+directive="dg-(?:error|warning|message|bogus)"
+# Line containing directive.
+directiveline=(
+    "(.*\{\s*%s.*)" % directive + # Part before line number.  Save it.
+    "\{\s*(%s)\s*\}" % number +   # A number in braces.  Save the number.
+    "\s*\}" +                     # Closing brace of directive.
+    "(.*)"                        # Rest of line.  Save it.
+)
+# Match the entire line
+directiveline=(
+    "^" +
+    directiveline +
+    "$"
+)
+pattern=re.compile(directiveline)
+
+extensions="c|cc|C|cpp|f|F|[fF]03|[fF]08|[fF]90|[fF]95|go|h|i|m|mm|S|adb|ads"
+extensionspattern=re.compile(".*\.(?:" + extensions + ")$")
+
+def do_replace_in_file(file):
+    for line in fileinput.input(files=file,inplace=True):
+        match=pattern.search(line)
+        if match:
+            line=(
+                match.group(1) + # Part before line number.
+                match.group(2) + # Line number.
+                " }" +           # Closing brace of directive.
+                match.group(3)   # Rest of line.
+            )
+            line+="\n"
+
+        print(line, end='')
+
+def replace_in_file_p(file):
+    filehandle = open(file, 'r')
+    for line in filehandle:
+        match=pattern.search(line)
+        if match:
+            return True
+
+    return False
+
+def do_testsuite_dir(testsuite_dir):
+    for root, dirs, files in os.walk(testsuite_dir):
+        for file in files:
+            if extensionspattern.match(file):
+                fullname=os.path.join(root, file)
+                if replace_in_file_p(fullname):
+                    do_replace_in_file(fullname)
+
+def do_dir(rootdir):
+    for root, dirs, files in os.walk(rootdir):
+        for dir in dirs:
+            if dir == "testsuite":
+                do_testsuite_dir(os.path.join(root, dir))
+
+do_dir(".")
Remove braces around line number in dejagnu directive

2017-04-14  Tom de Vries  <tom@codesourcery.com>

	* g++.dg/parse/error11.C: Remove braces around line number in dejagnu
	  directive.
	* g++.dg/parse/error3.C: Same.
	* g++.old-deja/g++.pt/niklas01a.C: Same.
	* gcc.dg/990506-0.c: Same.
	* gcc.dg/cpp/19990413-1.c: Same.
	* gcc.dg/cpp/pragma-1.c: Same.
	* gcc.dg/cpp/pragma-2.c: Same.
	* gcc.dg/m-un-2.c: Same.
	* objc.dg/private-1.m: Same.

---
 gcc/testsuite/g++.dg/parse/error11.C          | 2 +-
 gcc/testsuite/g++.dg/parse/error3.C           | 2 +-
 gcc/testsuite/g++.old-deja/g++.pt/niklas01a.C | 2 +-
 gcc/testsuite/gcc.dg/990506-0.c               | 4 ++--
 gcc/testsuite/gcc.dg/cpp/19990413-1.c         | 2 +-
 gcc/testsuite/gcc.dg/cpp/pragma-1.c           | 4 ++--
 gcc/testsuite/gcc.dg/cpp/pragma-2.c           | 4 ++--
 gcc/testsuite/gcc.dg/m-un-2.c                 | 4 ++--
 gcc/testsuite/objc.dg/private-1.m             | 2 +-
 9 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/gcc/testsuite/g++.dg/parse/error11.C b/gcc/testsuite/g++.dg/parse/error11.C
index 846e676..a67160b 100644
--- a/gcc/testsuite/g++.dg/parse/error11.C
+++ b/gcc/testsuite/g++.dg/parse/error11.C
@@ -50,7 +50,7 @@ void func(void)
   //  the special error message.
   Foo<: :B> k2;     // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" }
   Foo[:B> k1;       // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" } 
-// { dg-error "6:missing template arguments before" "template" { target *-*-* } { 51 } }
+// { dg-error "6:missing template arguments before" "template" { target *-*-* } 51 }
 // { dg-error "9:expected primary-expression before ':' token" "primary" { target *-*-* } 51 }
 // { dg-error "9:expected '\]' before ':' token" "backslash" { target *-*-* } 51 }
 // { dg-error "6:missing template arguments before" "template" { target *-*-* } 52 }
diff --git a/gcc/testsuite/g++.dg/parse/error3.C b/gcc/testsuite/g++.dg/parse/error3.C
index 938ab45..cf01dbe 100644
--- a/gcc/testsuite/g++.dg/parse/error3.C
+++ b/gcc/testsuite/g++.dg/parse/error3.C
@@ -5,4 +5,4 @@ static void InstantiateConstraint(const float&, unsigned,
                                   void(*AddFunction)(const TYPE&,bool&,
                                                      char*, char*,
                                                      unsigned*));
-// { dg-error "60: 'TYPE' does not name a type" "does not" { target *-*-* } { 5 } }
+// { dg-error "60: 'TYPE' does not name a type" "does not" { target *-*-* } 5 }
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/niklas01a.C b/gcc/testsuite/g++.old-deja/g++.pt/niklas01a.C
index 3130d32..f2b27a6 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/niklas01a.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/niklas01a.C
@@ -4,6 +4,6 @@
 struct A { // { dg-message "" } forward declaration
   friend struct B : A {		// { dg-error "invalid use of incomplete type 'struct A" "invalid" }
     int x;
-  };	// { dg-error "class definition may not be declared a friend" "may not"  { target *-*-* } { 5 } }
+  };	// { dg-error "class definition may not be declared a friend" "may not"  { target *-*-* } 5 }
   int y;
 };
diff --git a/gcc/testsuite/gcc.dg/990506-0.c b/gcc/testsuite/gcc.dg/990506-0.c
index 3cd3be3..3f5f02d 100644
--- a/gcc/testsuite/gcc.dg/990506-0.c
+++ b/gcc/testsuite/gcc.dg/990506-0.c
@@ -4,6 +4,6 @@
 x()
 {
   foo (i);
-  /* { dg-error "undeclared" "undeclared-variable message" { target *-*-* } { 6 } } */
-  /* { dg-message "function it appears in" "reminder message" { target *-*-* } { 6 } } */ 
+  /* { dg-error "undeclared" "undeclared-variable message" { target *-*-* } 6 } */
+  /* { dg-message "function it appears in" "reminder message" { target *-*-* } 6 } */ 
 }
diff --git a/gcc/testsuite/gcc.dg/cpp/19990413-1.c b/gcc/testsuite/gcc.dg/cpp/19990413-1.c
index 17d8441..c72c3a2 100644
--- a/gcc/testsuite/gcc.dg/cpp/19990413-1.c
+++ b/gcc/testsuite/gcc.dg/cpp/19990413-1.c
@@ -9,5 +9,5 @@ func(void)
 {
   FOO(i
       = 4)
-  else;  /* { dg-error "'else' without a previous 'if'" "error on this line" { target *-*-* } { 12 } } */ 
+  else;  /* { dg-error "'else' without a previous 'if'" "error on this line" { target *-*-* } 12 } */ 
 }
diff --git a/gcc/testsuite/gcc.dg/cpp/pragma-1.c b/gcc/testsuite/gcc.dg/cpp/pragma-1.c
index 7fab025..7b4ee36 100644
--- a/gcc/testsuite/gcc.dg/cpp/pragma-1.c
+++ b/gcc/testsuite/gcc.dg/cpp/pragma-1.c
@@ -7,7 +7,7 @@ main ()
 #pragma unknown
   {
     error;
-  /* { dg-error "undeclared" "undeclared-variable message" { target *-*-* } { 9 } } */
-  /* { dg-message "function it appears in" "reminder message" { target *-*-* } { 9 } } */ 
+  /* { dg-error "undeclared" "undeclared-variable message" { target *-*-* } 9 } */
+  /* { dg-message "function it appears in" "reminder message" { target *-*-* } 9 } */ 
   }
 }
diff --git a/gcc/testsuite/gcc.dg/cpp/pragma-2.c b/gcc/testsuite/gcc.dg/cpp/pragma-2.c
index 921f4e5..001365f 100644
--- a/gcc/testsuite/gcc.dg/cpp/pragma-2.c
+++ b/gcc/testsuite/gcc.dg/cpp/pragma-2.c
@@ -11,6 +11,6 @@ int main () {
 #pragma unknown
   {}
   error;
-  /* { dg-error "undeclared" "undeclared-variable message" { target *-*-* } { 13 } } */
-  /* { dg-message "function it appears in" "reminder message" { target *-*-* } { 13 } } */ 
+  /* { dg-error "undeclared" "undeclared-variable message" { target *-*-* } 13 } */
+  /* { dg-message "function it appears in" "reminder message" { target *-*-* } 13 } */ 
 }
diff --git a/gcc/testsuite/gcc.dg/m-un-2.c b/gcc/testsuite/gcc.dg/m-un-2.c
index 0b96628..882ae88 100644
--- a/gcc/testsuite/gcc.dg/m-un-2.c
+++ b/gcc/testsuite/gcc.dg/m-un-2.c
@@ -15,8 +15,8 @@ struct vtable {
 struct vtable mtable = {
   malloc,
   free
-}; /* { dg-warning "missing initializer" "warning regression" { target *-*-* } {18} } */
-   /* { dg-message "declared here" "warning regression 2" { target *-*-* } {12} } */
+}; /* { dg-warning "missing initializer" "warning regression" { target *-*-* } 18 } */
+   /* { dg-message "declared here" "warning regression 2" { target *-*-* } 12 } */
 
 /* With designated initializers, we assume you meant to leave out the
    initialization of any blank fields.  */
diff --git a/gcc/testsuite/objc.dg/private-1.m b/gcc/testsuite/objc.dg/private-1.m
index a11183c..790ba19 100644
--- a/gcc/testsuite/objc.dg/private-1.m
+++ b/gcc/testsuite/objc.dg/private-1.m
@@ -35,7 +35,7 @@
 {
   /* Private variables simply don't exist in the subclass.  */
   private = 12;  /* { dg-error "instance variable" } */
-  /* { dg-message "function it appears in" "" { target *-*-* } { 37 } } */
+  /* { dg-message "function it appears in" "" { target *-*-* } 37 } */
 
   protected = 12; /* Ok  */
   public = 12;    /* Ok  */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]