Source file test/fixedbugs/issue43619.go

     1  // run
     2  
     3  // Copyright 2021 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  package main
     8  
     9  import (
    10  	"fmt"
    11  	"math"
    12  )
    13  
    14  //go:noinline
    15  func fcmplt(a, b float64, x uint64) uint64 {
    16  	if a < b {
    17  		x = 0
    18  	}
    19  	return x
    20  }
    21  
    22  //go:noinline
    23  func fcmple(a, b float64, x uint64) uint64 {
    24  	if a <= b {
    25  		x = 0
    26  	}
    27  	return x
    28  }
    29  
    30  //go:noinline
    31  func fcmpgt(a, b float64, x uint64) uint64 {
    32  	if a > b {
    33  		x = 0
    34  	}
    35  	return x
    36  }
    37  
    38  //go:noinline
    39  func fcmpge(a, b float64, x uint64) uint64 {
    40  	if a >= b {
    41  		x = 0
    42  	}
    43  	return x
    44  }
    45  
    46  //go:noinline
    47  func fcmpeq(a, b float64, x uint64) uint64 {
    48  	if a == b {
    49  		x = 0
    50  	}
    51  	return x
    52  }
    53  
    54  //go:noinline
    55  func fcmpne(a, b float64, x uint64) uint64 {
    56  	if a != b {
    57  		x = 0
    58  	}
    59  	return x
    60  }
    61  
    62  func main() {
    63  	type fn func(a, b float64, x uint64) uint64
    64  
    65  	type testCase struct {
    66  		f       fn
    67  		a, b    float64
    68  		x, want uint64
    69  	}
    70  	NaN := math.NaN()
    71  	for _, t := range []testCase{
    72  		{fcmplt, 1.0, 1.0, 123, 123},
    73  		{fcmple, 1.0, 1.0, 123, 0},
    74  		{fcmpgt, 1.0, 1.0, 123, 123},
    75  		{fcmpge, 1.0, 1.0, 123, 0},
    76  		{fcmpeq, 1.0, 1.0, 123, 0},
    77  		{fcmpne, 1.0, 1.0, 123, 123},
    78  
    79  		{fcmplt, 1.0, 2.0, 123, 0},
    80  		{fcmple, 1.0, 2.0, 123, 0},
    81  		{fcmpgt, 1.0, 2.0, 123, 123},
    82  		{fcmpge, 1.0, 2.0, 123, 123},
    83  		{fcmpeq, 1.0, 2.0, 123, 123},
    84  		{fcmpne, 1.0, 2.0, 123, 0},
    85  
    86  		{fcmplt, 2.0, 1.0, 123, 123},
    87  		{fcmple, 2.0, 1.0, 123, 123},
    88  		{fcmpgt, 2.0, 1.0, 123, 0},
    89  		{fcmpge, 2.0, 1.0, 123, 0},
    90  		{fcmpeq, 2.0, 1.0, 123, 123},
    91  		{fcmpne, 2.0, 1.0, 123, 0},
    92  
    93  		{fcmplt, 1.0, NaN, 123, 123},
    94  		{fcmple, 1.0, NaN, 123, 123},
    95  		{fcmpgt, 1.0, NaN, 123, 123},
    96  		{fcmpge, 1.0, NaN, 123, 123},
    97  		{fcmpeq, 1.0, NaN, 123, 123},
    98  		{fcmpne, 1.0, NaN, 123, 0},
    99  
   100  		{fcmplt, NaN, 1.0, 123, 123},
   101  		{fcmple, NaN, 1.0, 123, 123},
   102  		{fcmpgt, NaN, 1.0, 123, 123},
   103  		{fcmpge, NaN, 1.0, 123, 123},
   104  		{fcmpeq, NaN, 1.0, 123, 123},
   105  		{fcmpne, NaN, 1.0, 123, 0},
   106  
   107  		{fcmplt, NaN, NaN, 123, 123},
   108  		{fcmple, NaN, NaN, 123, 123},
   109  		{fcmpgt, NaN, NaN, 123, 123},
   110  		{fcmpge, NaN, NaN, 123, 123},
   111  		{fcmpeq, NaN, NaN, 123, 123},
   112  		{fcmpne, NaN, NaN, 123, 0},
   113  	} {
   114  		got := t.f(t.a, t.b, t.x)
   115  		if got != t.want {
   116  			panic(fmt.Sprintf("want %v, got %v", t.want, got))
   117  		}
   118  	}
   119  }
   120  

View as plain text