Text file src/go/types/testdata/check/conversions2.src

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Test various valid and invalid struct assignments and conversions.
     6  // Does not compile.
     7  
     8  package conversions2
     9  
    10  type I interface {
    11  	m()
    12  }
    13  
    14  // conversions between structs
    15  
    16  func _() {
    17  	type S struct{}
    18  	type T struct{}
    19  	var s S
    20  	var t T
    21  	var u struct{}
    22  	s = s
    23  	s = t // ERROR "cannot use .* in assignment"
    24  	s = u
    25  	s = S(s)
    26  	s = S(t)
    27  	s = S(u)
    28  	t = u
    29  	t = T(u)
    30  }
    31  
    32  func _() {
    33  	type S struct{ x int }
    34  	type T struct {
    35  		x int "foo"
    36  	}
    37  	var s S
    38  	var t T
    39  	var u struct {
    40  		x int "bar"
    41  	}
    42  	s = s
    43  	s = t // ERROR "cannot use .* in assignment"
    44  	s = u // ERROR "cannot use .* in assignment"
    45  	s = S(s)
    46  	s = S(t)
    47  	s = S(u)
    48  	t = u // ERROR "cannot use .* in assignment"
    49  	t = T(u)
    50  }
    51  
    52  func _() {
    53  	type E struct{ x int }
    54  	type S struct{ x E }
    55  	type T struct {
    56  		x E "foo"
    57  	}
    58  	var s S
    59  	var t T
    60  	var u struct {
    61  		x E "bar"
    62  	}
    63  	s = s
    64  	s = t // ERROR "cannot use .* in assignment"
    65  	s = u // ERROR "cannot use .* in assignment"
    66  	s = S(s)
    67  	s = S(t)
    68  	s = S(u)
    69  	t = u // ERROR "cannot use .* in assignment"
    70  	t = T(u)
    71  }
    72  
    73  func _() {
    74  	type S struct {
    75  		x struct {
    76  			x int "foo"
    77  		}
    78  	}
    79  	type T struct {
    80  		x struct {
    81  			x int "bar"
    82  		} "foo"
    83  	}
    84  	var s S
    85  	var t T
    86  	var u struct {
    87  		x struct {
    88  			x int "bar"
    89  		} "bar"
    90  	}
    91  	s = s
    92  	s = t // ERROR "cannot use .* in assignment"
    93  	s = u // ERROR "cannot use .* in assignment"
    94  	s = S(s)
    95  	s = S(t)
    96  	s = S(u)
    97  	t = u // ERROR "cannot use .* in assignment"
    98  	t = T(u)
    99  }
   100  
   101  func _() {
   102  	type E1 struct {
   103  		x int "foo"
   104  	}
   105  	type E2 struct {
   106  		x int "bar"
   107  	}
   108  	type S struct{ x E1 }
   109  	type T struct {
   110  		x E2 "foo"
   111  	}
   112  	var s S
   113  	var t T
   114  	var u struct {
   115  		x E2 "bar"
   116  	}
   117  	s = s
   118  	s = t // ERROR "cannot use .* in assignment"
   119  	s = u // ERROR "cannot use .* in assignment"
   120  	s = S(s)
   121  	s = S(t /* ERROR "cannot convert" */ )
   122  	s = S(u /* ERROR "cannot convert" */ )
   123  	t = u   // ERROR "cannot use .* in assignment"
   124  	t = T(u)
   125  }
   126  
   127  func _() {
   128  	type E struct{ x int }
   129  	type S struct {
   130  		f func(struct {
   131  			x int "foo"
   132  		})
   133  	}
   134  	type T struct {
   135  		f func(struct {
   136  			x int "bar"
   137  		})
   138  	}
   139  	var s S
   140  	var t T
   141  	var u struct{ f func(E) }
   142  	s = s
   143  	s = t // ERROR "cannot use .* in assignment"
   144  	s = u // ERROR "cannot use .* in assignment"
   145  	s = S(s)
   146  	s = S(t)
   147  	s = S(u /* ERROR "cannot convert" */ )
   148  	t = u   // ERROR "cannot use .* in assignment"
   149  	t = T(u /* ERROR "cannot convert" */ )
   150  }
   151  
   152  // conversions between pointers to structs
   153  
   154  func _() {
   155  	type S struct{}
   156  	type T struct{}
   157  	var s *S
   158  	var t *T
   159  	var u *struct{}
   160  	s = s
   161  	s = t // ERROR "cannot use .* in assignment"
   162  	s = u // ERROR "cannot use .* in assignment"
   163  	s = (*S)(s)
   164  	s = (*S)(t)
   165  	s = (*S)(u)
   166  	t = u // ERROR "cannot use .* in assignment"
   167  	t = (*T)(u)
   168  }
   169  
   170  func _() {
   171  	type S struct{ x int }
   172  	type T struct {
   173  		x int "foo"
   174  	}
   175  	var s *S
   176  	var t *T
   177  	var u *struct {
   178  		x int "bar"
   179  	}
   180  	s = s
   181  	s = t // ERROR "cannot use .* in assignment"
   182  	s = u // ERROR "cannot use .* in assignment"
   183  	s = (*S)(s)
   184  	s = (*S)(t)
   185  	s = (*S)(u)
   186  	t = u // ERROR "cannot use .* in assignment"
   187  	t = (*T)(u)
   188  }
   189  
   190  func _() {
   191  	type E struct{ x int }
   192  	type S struct{ x E }
   193  	type T struct {
   194  		x E "foo"
   195  	}
   196  	var s *S
   197  	var t *T
   198  	var u *struct {
   199  		x E "bar"
   200  	}
   201  	s = s
   202  	s = t // ERROR "cannot use .* in assignment"
   203  	s = u // ERROR "cannot use .* in assignment"
   204  	s = (*S)(s)
   205  	s = (*S)(t)
   206  	s = (*S)(u)
   207  	t = u // ERROR "cannot use .* in assignment"
   208  	t = (*T)(u)
   209  }
   210  
   211  func _() {
   212  	type S struct {
   213  		x struct {
   214  			x int "foo"
   215  		}
   216  	}
   217  	type T struct {
   218  		x struct {
   219  			x int "bar"
   220  		} "foo"
   221  	}
   222  	var s *S
   223  	var t *T
   224  	var u *struct {
   225  		x struct {
   226  			x int "bar"
   227  		} "bar"
   228  	}
   229  	s = s
   230  	s = t // ERROR "cannot use .* in assignment"
   231  	s = u // ERROR "cannot use .* in assignment"
   232  	s = (*S)(s)
   233  	s = (*S)(t)
   234  	s = (*S)(u)
   235  	t = u // ERROR "cannot use .* in assignment"
   236  	t = (*T)(u)
   237  }
   238  
   239  func _() {
   240  	type E1 struct {
   241  		x int "foo"
   242  	}
   243  	type E2 struct {
   244  		x int "bar"
   245  	}
   246  	type S struct{ x E1 }
   247  	type T struct {
   248  		x E2 "foo"
   249  	}
   250  	var s *S
   251  	var t *T
   252  	var u *struct {
   253  		x E2 "bar"
   254  	}
   255  	s = s
   256  	s = t // ERROR "cannot use .* in assignment"
   257  	s = u // ERROR "cannot use .* in assignment"
   258  	s = (*S)(s)
   259  	s = (*S)(t /* ERROR "cannot convert" */ )
   260  	s = (*S)(u /* ERROR "cannot convert" */ )
   261  	t = u      // ERROR "cannot use .* in assignment"
   262  	t = (*T)(u)
   263  }
   264  
   265  func _() {
   266  	type E struct{ x int }
   267  	type S struct {
   268  		f func(struct {
   269  			x int "foo"
   270  		})
   271  	}
   272  	type T struct {
   273  		f func(struct {
   274  			x int "bar"
   275  		})
   276  	}
   277  	var s *S
   278  	var t *T
   279  	var u *struct{ f func(E) }
   280  	s = s
   281  	s = t // ERROR "cannot use .* in assignment"
   282  	s = u // ERROR "cannot use .* in assignment"
   283  	s = (*S)(s)
   284  	s = (*S)(t)
   285  	s = (*S)(u /* ERROR "cannot convert" */ )
   286  	t = u      // ERROR "cannot use .* in assignment"
   287  	t = (*T)(u /* ERROR "cannot convert" */ )
   288  }
   289  
   290  func _() {
   291  	type E struct{ x int }
   292  	type S struct {
   293  		f func(*struct {
   294  			x int "foo"
   295  		})
   296  	}
   297  	type T struct {
   298  		f func(*struct {
   299  			x int "bar"
   300  		})
   301  	}
   302  	var s *S
   303  	var t *T
   304  	var u *struct{ f func(E) }
   305  	s = s
   306  	s = t // ERROR "cannot use .* in assignment"
   307  	s = u // ERROR "cannot use .* in assignment"
   308  	s = (*S)(s)
   309  	s = (*S)(t)
   310  	s = (*S)(u /* ERROR "cannot convert" */ )
   311  	t = u      // ERROR "cannot use .* in assignment"
   312  	t = (*T)(u /* ERROR "cannot convert" */ )
   313  }
   314  

View as plain text