diff mbox series

[pushed] c++: improve C++ testsuite default versions

Message ID 20240727202540.3933690-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: improve C++ testsuite default versions | expand

Commit Message

Jason Merrill July 27, 2024, 8:25 p.m. UTC
Tested x86_64-pc-linux-gnu, applying to trunk.

-- 8< --

I wanted to add more cases to the setting of std_list in g++-dg.exp, but
didn't want to do a full scan through the file for each case.  So this patch
improves that in two ways: first, by extracting all interesting lines on a
single pass; second, by generating the list more flexibly: now we test every
version mentioned explicitly in the testcase, plus a few more if fewer than
three are mentioned.

This also lowers changes from testing four to three versions for most
testcases: the current default and the earliest and latest versions.  This
will reduce testing of C++14 and C++20 modes, and increase testing of C++26
mode.  C++ front-end developers are encouraged to set the
GXX_TESTSUITE_STDS environment variable to test more modes.

gcc/testsuite/ChangeLog:

	* lib/gcc-dg.exp (get_matching_lines): New.
	* lib/g++-dg.exp: Improve std_list selection.
---
 gcc/testsuite/lib/g++-dg.exp | 45 +++++++++++++++++++++++++-----------
 gcc/testsuite/lib/gcc-dg.exp | 13 +++++++++++
 2 files changed, 44 insertions(+), 14 deletions(-)


base-commit: 928116e94a5a8a995dffd926af58abfa7286e78e
diff mbox series

Patch

diff --git a/gcc/testsuite/lib/g++-dg.exp b/gcc/testsuite/lib/g++-dg.exp
index 52fba75c4a3..991be4d3867 100644
--- a/gcc/testsuite/lib/g++-dg.exp
+++ b/gcc/testsuite/lib/g++-dg.exp
@@ -53,21 +53,38 @@  proc g++-dg-runtest { testcases flags default-extra-flags } {
 	    if { [llength $gpp_std_list] > 0 } {
 		set std_list $gpp_std_list
 	    } else {
-		# If the test requires a newer C++ version than which
-		# is tested by default, use that C++ version for that
-		# single test.  Or if a test checks behavior specifically for
-		# one C++ version, include that version in the default list.
-		# These should be adjusted whenever the default std_list is
-		# updated or newer C++ effective target is added.
-		if [search_for $test "\{ dg-do * \{ target c++23"] {
-		    set std_list { 23 26 }
-		} elseif [search_for $test "\{ dg-do * \{ target c++26"] {
-		    set std_list { 26 }
-		} elseif [search_for $test "c++11_only"] {
-		    set std_list { 98 11 14 20 }
-		} else {
-		    set std_list { 98 14 17 20 }
+		# If the test mentions specific C++ versions, test those.
+		set lines [get_matching_lines $test {\{ dg* c++[0-9][0-9]}]
+		set std_list {}
+		set low 0
+		foreach line $lines {
+		    regexp {c\+\+([0-9][0-9])} $line -> ver
+		    lappend std_list $ver
+
+		    if { $ver == 98 } {
+			# Leave low alone.
+		    } elseif { [regexp {dg-do|dg-require-effective-target} $line] } {
+			set low $ver
+		    }
 		}
+		#verbose "low: $low" 1
+
+		set std_list [lsort -unique $std_list]
+
+		# If fewer than 3 specific versions are mentioned, add more.
+		# The order of this list is significant: first $cxx_default,
+		# then the oldest and newest, then others in rough order of
+		# importance based on test coverage and usage.
+		foreach ver { 17 98 26 11 20 14 23 } {
+		    set cmpver $ver
+		    if { $ver == 98 } { set cmpver 03 }
+		    if { [llength $std_list] < 3
+			 && $ver ni $std_list
+			 && $cmpver > $low } {
+			lappend std_list $ver
+		    }
+		}
+		verbose "std_list: $std_list" 1
 	    }
 	    set option_list { }
 	    foreach x $std_list {
diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp
index 228c21d1207..992062103c1 100644
--- a/gcc/testsuite/lib/gcc-dg.exp
+++ b/gcc/testsuite/lib/gcc-dg.exp
@@ -574,6 +574,19 @@  proc search_for { file pattern } {
     return 0
 }
 
+# get_matching_lines -- return a list of matching lines in file
+proc get_matching_lines { file pattern } {
+    set lines {}
+    set fd [open $file r]
+    while { [gets $fd cur_line]>=0 } {
+	if [string match "*$pattern*" $cur_line] then {
+	    lappend lines $cur_line
+	}
+    }
+    close $fd
+    return $lines
+}
+
 # Modified dg-runtest that can cycle through a list of optimization options
 # as c-torture does.
 proc gcc-dg-runtest { testcases flags default-extra-flags } {