Source file test/phiopt.go

     1  // errorcheck -0 -d=ssa/phiopt/debug=3
     2  
     3  //go:build amd64 || s390x || arm64
     4  
     5  // Copyright 2016 The Go Authors. All rights reserved.
     6  // Use of this source code is governed by a BSD-style
     7  // license that can be found in the LICENSE file.
     8  
     9  package main
    10  
    11  //go:noinline
    12  func f0(a bool) bool {
    13  	x := false
    14  	if a {
    15  		x = true
    16  	} else {
    17  		x = false
    18  	}
    19  	return x // ERROR "converted OpPhi to Copy$"
    20  }
    21  
    22  //go:noinline
    23  func f1(a bool) bool {
    24  	x := false
    25  	if a {
    26  		x = false
    27  	} else {
    28  		x = true
    29  	}
    30  	return x // ERROR "converted OpPhi to Not$"
    31  }
    32  
    33  //go:noinline
    34  func f2(a, b int) bool {
    35  	x := true
    36  	if a == b {
    37  		x = false
    38  	}
    39  	return x // ERROR "converted OpPhi to Not$"
    40  }
    41  
    42  //go:noinline
    43  func f3(a, b int) bool {
    44  	x := false
    45  	if a == b {
    46  		x = true
    47  	}
    48  	return x // ERROR "converted OpPhi to Copy$"
    49  }
    50  
    51  //go:noinline
    52  func f4(a, b bool) bool {
    53  	return a || b // ERROR "converted OpPhi to OrB$"
    54  }
    55  
    56  //go:noinline
    57  func f5or(a int, b bool) bool {
    58  	var x bool
    59  	if a == 0 {
    60  		x = true
    61  	} else {
    62  		x = b
    63  	}
    64  	return x // ERROR "converted OpPhi to OrB$"
    65  }
    66  
    67  //go:noinline
    68  func f5and(a int, b bool) bool {
    69  	var x bool
    70  	if a == 0 {
    71  		x = b
    72  	} else {
    73  		x = false
    74  	}
    75  	return x // ERROR "converted OpPhi to AndB$"
    76  }
    77  
    78  //go:noinline
    79  func f6or(a int, b bool) bool {
    80  	x := b
    81  	if a == 0 {
    82  		// f6or has side effects so the OpPhi should not be converted.
    83  		x = f6or(a, b)
    84  	}
    85  	return x
    86  }
    87  
    88  //go:noinline
    89  func f6and(a int, b bool) bool {
    90  	x := b
    91  	if a == 0 {
    92  		// f6and has side effects so the OpPhi should not be converted.
    93  		x = f6and(a, b)
    94  	}
    95  	return x
    96  }
    97  
    98  //go:noinline
    99  func f7or(a bool, b bool) bool {
   100  	return a || b // ERROR "converted OpPhi to OrB$"
   101  }
   102  
   103  //go:noinline
   104  func f7and(a bool, b bool) bool {
   105  	return a && b // ERROR "converted OpPhi to AndB$"
   106  }
   107  
   108  //go:noinline
   109  func f8(s string) (string, bool) {
   110  	neg := false
   111  	if s[0] == '-' {    // ERROR "converted OpPhi to Copy$"
   112  		neg = true
   113  		s = s[1:]
   114  	}
   115  	return s, neg
   116  }
   117  
   118  var d int
   119  
   120  //go:noinline
   121  func f9(a, b int) bool {
   122  	c := false
   123  	if a < 0 {          // ERROR "converted OpPhi to Copy$"
   124  		if b < 0 {
   125  			d = d + 1
   126  		}
   127  		c = true
   128  	}
   129  	return c
   130  }
   131  
   132  func main() {
   133  }
   134  

View as plain text