Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 1 | // errorcheck |
| 2 | |
| 3 | // Copyright 2016 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 | // Test basic restrictions on type aliases. |
| 8 | |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 9 | package p |
| 10 | |
| 11 | import ( |
| 12 | "reflect" |
| 13 | . "reflect" |
| 14 | ) |
| 15 | |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 16 | type T0 struct{} |
| 17 | |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 18 | // Valid type alias declarations. |
| 19 | |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 20 | type _ = T0 |
| 21 | type _ = int |
| 22 | type _ = struct{} |
| 23 | type _ = reflect.Value |
| 24 | type _ = Value |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 25 | |
| 26 | type ( |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 27 | A0 = T0 |
| 28 | A1 = int |
| 29 | A2 = struct{} |
| 30 | A3 = reflect.Value |
| 31 | A4 = Value |
| 32 | A5 = Value |
| 33 | |
| 34 | N0 A0 |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 35 | ) |
| 36 | |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 37 | // Methods can be declared on the original named type and the alias. |
Ian Lance Taylor | 9259f30 | 2017-01-24 12:43:52 -0800 | [diff] [blame] | 38 | func (T0) m1() {} // GCCGO_ERROR "previous" |
Robert Griesemer | 7398c3c | 2022-09-26 21:27:20 -0700 | [diff] [blame] | 39 | func (*T0) m1() {} // ERROR "method redeclared: T0\.m1|T0\.m1 already declared|redefinition of .m1." |
| 40 | func (A0) m1() {} // ERROR "T0\.m1 already declared|redefinition of .m1." |
| 41 | func (A0) m1() {} // ERROR "T0\.m1 already declared|redefinition of .m1." |
Robert Griesemer | 5802cfd | 2017-01-13 17:23:01 -0800 | [diff] [blame] | 42 | func (A0) m2() {} |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 43 | |
| 44 | // Type aliases and the original type name can be used interchangeably. |
| 45 | var _ A0 = T0{} |
| 46 | var _ T0 = A0{} |
| 47 | |
| 48 | // But aliases and original types cannot be used with new types based on them. |
Robert Griesemer | 7d9802a | 2024-10-22 11:48:38 -0700 | [diff] [blame] | 49 | var _ N0 = T0{} // ERROR "cannot use T0{} \(value of struct type T0\) as N0 value in variable declaration" |
| 50 | var _ N0 = A0{} // ERROR "cannot use A0{} \(value of struct type A0\) as N0 value in variable declaration" |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 51 | |
| 52 | var _ A5 = Value{} |
| 53 | |
| 54 | var _ interface { |
| 55 | m1() |
| 56 | m2() |
| 57 | } = T0{} |
| 58 | |
| 59 | var _ interface { |
| 60 | m1() |
| 61 | m2() |
| 62 | } = A0{} |
| 63 | |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 64 | func _() { |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 65 | type _ = T0 |
| 66 | type _ = int |
| 67 | type _ = struct{} |
| 68 | type _ = reflect.Value |
| 69 | type _ = Value |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 70 | |
| 71 | type ( |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 72 | A0 = T0 |
| 73 | A1 = int |
| 74 | A2 = struct{} |
| 75 | A3 = reflect.Value |
| 76 | A4 = Value |
| 77 | A5 Value |
| 78 | |
| 79 | N0 A0 |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 80 | ) |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 81 | |
| 82 | var _ A0 = T0{} |
| 83 | var _ T0 = A0{} |
| 84 | |
Robert Griesemer | 7d9802a | 2024-10-22 11:48:38 -0700 | [diff] [blame] | 85 | var _ N0 = T0{} // ERROR "cannot use T0{} \(value of struct type T0\) as N0 value in variable declaration" |
| 86 | var _ N0 = A0{} // ERROR "cannot use A0{} \(value of struct type A0\) as N0 value in variable declaration" |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 87 | |
Robert Griesemer | 7d9802a | 2024-10-22 11:48:38 -0700 | [diff] [blame] | 88 | var _ A5 = Value{} // ERROR "cannot use Value{} \(value of struct type reflect\.Value\) as A5 value in variable declaration" |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 89 | } |
| 90 | |
| 91 | // Invalid type alias declarations. |
| 92 | |
Robert Griesemer | 72ad2f4 | 2020-11-30 21:38:49 -0800 | [diff] [blame] | 93 | type _ = reflect.ValueOf // ERROR "reflect.ValueOf .*is not a type|expected type" |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 94 | |
Matthew Dempsky | 31c8150 | 2024-05-14 22:22:34 -0700 | [diff] [blame] | 95 | func (A1) m() {} // ERROR "cannot define new methods on non-local type|may not define methods on non-local type" |
Ian Lance Taylor | 9259f30 | 2017-01-24 12:43:52 -0800 | [diff] [blame] | 96 | func (A2) m() {} // ERROR "invalid receiver type" |
Matthew Dempsky | 31c8150 | 2024-05-14 22:22:34 -0700 | [diff] [blame] | 97 | func (A3) m() {} // ERROR "cannot define new methods on non-local type|may not define methods on non-local type" |
| 98 | func (A4) m() {} // ERROR "cannot define new methods on non-local type|may not define methods on non-local type" |
Robert Griesemer | b2386df | 2017-01-11 11:24:35 -0800 | [diff] [blame] | 99 | |
| 100 | type B1 = struct{} |
| 101 | |
Matthew Dempsky | 638f112 | 2018-04-04 18:42:39 -0700 | [diff] [blame] | 102 | func (B1) m() {} // ERROR "invalid receiver type" |
Robert Griesemer | 3e11940 | 2016-12-16 16:28:30 -0800 | [diff] [blame] | 103 | |
| 104 | // TODO(gri) expand |