diff mbox

[testsuite] support using "target" and "xfail" together

Message ID 500EE5E1.8090204@mentor.com
State New
Headers show

Commit Message

Janis Johnson July 24, 2012, 6:13 p.m. UTC
This patch allows the use of both "target" and "xfail" in the selector
of any test directive that currently takes either "target" or "xfail":

  { target selector1 xfail selector2 }

The test is only used if the "target" selector is matched, and the test
is expected to fail if the "xfail" selector is matched.  The keyword
"target" must come first; it doesn't make sense to me otherwise because
the xfail part shouldn't be processed if the target selector doesn't
match.

Tested with i686-pc-linux-gnu for c,c++,gfortran,objc,obj-c++ plus with
examples using the new feature, with and without errors.

I'd like some feedback before checking this in so I'll wait at least a
couple of days.  I plan to put it on the 4.7 branch also.

Janis
2012-07-24  Janis Johnson  <janisjo@codesourcery.com>

	doc/sourcebuild.texi (Selectors): Document the use of target
	and xfail used together.
testsuite/
	* lib/target-supports-dg.exp (dg-require-effective-target,
	dg-skip-if, dg-xfail-if, dg-xfail-run-if, dg-shouldfail): Call
	dg-process-target-1 instead of dg-process-target.
	(dg-process-target-1): Rename from dg-process-target.
	(dg-process-target): New.

Comments

Janis Johnson Sept. 19, 2012, 5:35 p.m. UTC | #1
Ping.

On 07/24/2012 11:13 AM, Janis Johnson wrote:
> This patch allows the use of both "target" and "xfail" in the selector
> of any test directive that currently takes either "target" or "xfail":
> 
>   { target selector1 xfail selector2 }
> 
> The test is only used if the "target" selector is matched, and the test
> is expected to fail if the "xfail" selector is matched.  The keyword
> "target" must come first; it doesn't make sense to me otherwise because
> the xfail part shouldn't be processed if the target selector doesn't
> match.
> 
> Tested with i686-pc-linux-gnu for c,c++,gfortran,objc,obj-c++ plus with
> examples using the new feature, with and without errors.
> 
> I'd like some feedback before checking this in so I'll wait at least a
> couple of days.  I plan to put it on the 4.7 branch also.

I'd still like some feedback; I guess I lied when I said I'd check it
in anyway.

Janis
Mike Stump Sept. 19, 2012, 5:48 p.m. UTC | #2
On Sep 19, 2012, at 10:35 AM, Janis Johnson <janis_johnson@mentor.com> wrote:
> On 07/24/2012 11:13 AM, Janis Johnson wrote:
>> This patch allows the use of both "target" and "xfail" in the selector
>> of any test directive that currently takes either "target" or "xfail":
>> 
>>  { target selector1 xfail selector2 }
>> 
>> The test is only used if the "target" selector is matched, and the test
>> is expected to fail if the "xfail" selector is matched.  The keyword
>> "target" must come first; it doesn't make sense to me otherwise because
>> the xfail part shouldn't be processed if the target selector doesn't
>> match.
>> 
>> Tested with i686-pc-linux-gnu for c,c++,gfortran,objc,obj-c++ plus with
>> examples using the new feature, with and without errors.
>> 
>> I'd like some feedback before checking this in so I'll wait at least a
>> couple of days.  I plan to put it on the 4.7 branch also.
> 
> I'd still like some feedback; I guess I lied when I said I'd check it
> in anyway.

I like it.  What's not to like?
Janis Johnson Sept. 19, 2012, 5:51 p.m. UTC | #3
On 09/19/2012 10:48 AM, Mike Stump wrote:
> On Sep 19, 2012, at 10:35 AM, Janis Johnson <janis_johnson@mentor.com> wrote:
>> On 07/24/2012 11:13 AM, Janis Johnson wrote:
>>> This patch allows the use of both "target" and "xfail" in the selector
>>> of any test directive that currently takes either "target" or "xfail":
>>>
>>>  { target selector1 xfail selector2 }
>>>
>>> The test is only used if the "target" selector is matched, and the test
>>> is expected to fail if the "xfail" selector is matched.  The keyword
>>> "target" must come first; it doesn't make sense to me otherwise because
>>> the xfail part shouldn't be processed if the target selector doesn't
>>> match.
>>>
>>> Tested with i686-pc-linux-gnu for c,c++,gfortran,objc,obj-c++ plus with
>>> examples using the new feature, with and without errors.
>>>
>>> I'd like some feedback before checking this in so I'll wait at least a
>>> couple of days.  I plan to put it on the 4.7 branch also.
>>
>> I'd still like some feedback; I guess I lied when I said I'd check it
>> in anyway.
> 
> I like it.  What's not to like?

All right then, I'll check it in on trunk, and on 4.7 when it's open.
Thanks!

Janis
diff mbox

Patch

Index: doc/sourcebuild.texi
===================================================================
--- doc/sourcebuild.texi	(revision 189790)
+++ doc/sourcebuild.texi	(working copy)
@@ -1232,15 +1232,18 @@ 
 
 A selector is:
 @itemize @bullet
-@item one or more target triplets, possibly including wildcard characters
+@item one or more target triplets, possibly including wildcard characters;
+use @samp{*-*-*} to match any target
 @item a single effective-target keyword (@pxref{Effective-Target Keywords})
 @item a logical expression
 @end itemize
 
-Depending on the
-context, the selector specifies whether a test is skipped and reported
-as unsupported or is expected to fail.  Use @samp{*-*-*} to match any
-target.
+Depending on the context, the selector specifies whether a test is
+skipped and reported as unsupported or is expected to fail.  A context
+that allows either @samp{target} or @samp{xfail} also allows
+@samp{@{ target @var{selector1} xfail @var{selector2} @}}
+to skip the test for targets that don't match @var{selector1} and the
+test to fail for targets that match @var{selector2}.
 
 A selector expression appears within curly braces and uses a single
 logical operator: one of @samp{!}, @samp{&&}, or @samp{||}.  An
Index: testsuite/lib/target-supports-dg.exp
===================================================================
--- testsuite/lib/target-supports-dg.exp	(revision 189790)
+++ testsuite/lib/target-supports-dg.exp	(working copy)
@@ -208,7 +208,7 @@ 
     
     # Evaluate selector if present.
     if { [llength $args] == 2 } {
-	switch [dg-process-target [lindex $args 1]] {
+	switch [dg-process-target-1 [lindex $args 1]] {
 	    "S" { }
 	    "N" { return }
 	}
@@ -359,7 +359,7 @@ 
     }
 
     set selector [list target [lindex $args 1]]
-    if { [dg-process-target $selector] == "S" } {
+    if { [dg-process-target-1 $selector] == "S" } {
 	if [check-flags $args] {
 	    upvar dg-do-what dg-do-what
             set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
@@ -383,7 +383,7 @@ 
     }
 
     set selector [list target [lindex $args 1]]
-    if { [dg-process-target $selector] == "S" } {
+    if { [dg-process-target-1 $selector] == "S" } {
 	global compiler_conditional_xfail_data
 
 	# The target list might be an effective-target keyword.  Replace
@@ -418,7 +418,7 @@ 
     }
 
     set selector [list target [lindex $args 1]]
-    if { [dg-process-target $selector] == "S" } {
+    if { [dg-process-target-1 $selector] == "S" } {
 	if [check-flags $args] {
 	    upvar dg-do-what dg-do-what
             set dg-do-what [list [lindex ${dg-do-what} 0] "S" "F"]
@@ -442,7 +442,7 @@ 
     set args [lreplace $args 0 0]
     if { [llength $args] > 1 } {
 	set selector [list target [lindex $args 1]]
-	if { [dg-process-target $selector] == "S" } {
+	if { [dg-process-target-1 $selector] == "S" } {
 	    # The target matches, now check the flags.
 	    if [check-flags $args] {
 		set shouldfail 1
@@ -457,16 +457,19 @@ 
 # support use of an effective-target keyword in place of a list of
 # target triplets to xfail or skip a test.
 #
-# selector is one of:
-#    xfail target-triplet-1 ...
-#    xfail effective-target-keyword
-#    xfail selector-expression
-#    target target-triplet-1 ...
-#    target effective-target-keyword
-#    target selector-expression
+# The argument to dg-process-target is the keyword "target" or "xfail"
+# followed by a selector:
+#    target-triplet-1 ...
+#    effective-target-keyword
+#    selector-expression
 #
 # For a target list the result is "S" if the target is selected, "N" otherwise.
 # For an xfail list the result is "F" if the target is affected, "P" otherwise.
+
+# In contexts that allow either "target" or "xfail" the argument can be
+#    target selector1 xfail selector2
+# which returns "N" if selector1 is not selected, otherwise the result of
+# "xfail selector2".
 #
 # A selector expression appears within curly braces and uses a single logical
 # operator: !, &&, or ||.  An operand is another selector expression, an
@@ -526,9 +529,11 @@ 
 	return $answer
     }
 
-    proc dg-process-target { args } {
-	verbose "replacement dg-process-target: `$args'" 2
-	
+    # Evaluate "target selector" or "xfail selector".
+
+    proc dg-process-target-1 { args } {
+	verbose "dg-process-target-1: `$args'" 2
+
 	# Extract the 'what' keyword from the argument list.
 	set selector [string trim [lindex $args 0]]
 	if [regexp "^xfail " $selector] {
@@ -564,4 +569,29 @@ 
 	# the list of target triplets.
 	return [saved-dg-process-target $selector]
     }
+
+    # Intercept calls to the DejaGnu function.  In addition to
+    # processing "target selector" or "xfail selector", handle
+    # "target selector1 xfail selector2".
+
+    proc dg-process-target { args } {
+	verbose "replacement dg-process-target: `$args'" 2
+
+	set selector [string trim [lindex $args 0]]
+
+	# If the argument list contains both 'target' and 'xfail',
+	# process 'target' and, if that succeeds, process 'xfail'.
+	if [regexp "^target .* xfail .*" $selector] {
+	    set xfail_index [string first "xfail" $selector]
+	    set xfail_selector [string range $selector $xfail_index end]
+	    set target_selector [string range $selector 0 $xfail_index-1]
+	    set target_selector [string trim $target_selector]
+	    if { [dg-process-target-1 $target_selector] == "N" } {
+		return "N"
+	    }
+	    return [dg-process-target-1 $xfail_selector]
+	    
+	}
+	return [dg-process-target-1 $selector]
+    }
 }