Source file
src/go/types/expr.go
1
2
3
4
5
6
7 package types
8
9 import (
10 "fmt"
11 "go/ast"
12 "go/constant"
13 "go/token"
14 . "internal/types/errors"
15 )
16
17
58
59 type opPredicates map[token.Token]func(Type) bool
60
61 var unaryOpPredicates opPredicates
62
63 func init() {
64
65 unaryOpPredicates = opPredicates{
66 token.ADD: allNumeric,
67 token.SUB: allNumeric,
68 token.XOR: allInteger,
69 token.NOT: allBoolean,
70 }
71 }
72
73 func (check *Checker) op(m opPredicates, x *operand, op token.Token) bool {
74 if pred := m[op]; pred != nil {
75 if !pred(x.typ()) {
76 check.errorf(x, UndefinedOp, invalidOp+"operator %s not defined on %s", op, x)
77 return false
78 }
79 } else {
80 check.errorf(x, InvalidSyntaxTree, "unknown operator %s", op)
81 return false
82 }
83 return true
84 }
85
86
87
88 func opPos(x ast.Expr) token.Pos {
89 switch op := x.(type) {
90 case nil:
91 return nopos
92 case *ast.BinaryExpr:
93 return op.OpPos
94 default:
95 return x.Pos()
96 }
97 }
98
99
100
101 func opName(e ast.Expr) string {
102 switch e := e.(type) {
103 case *ast.BinaryExpr:
104 if int(e.Op) < len(op2str2) {
105 return op2str2[e.Op]
106 }
107 case *ast.UnaryExpr:
108 if int(e.Op) < len(op2str1) {
109 return op2str1[e.Op]
110 }
111 }
112 return ""
113 }
114
115 var op2str1 = [...]string{
116 token.XOR: "bitwise complement",
117 }
118
119
120 var op2str2 = [...]string{
121 token.ADD: "addition",
122 token.SUB: "subtraction",
123 token.XOR: "bitwise XOR",
124 token.MUL: "multiplication",
125 token.SHL: "shift",
126 }
127
128
129 func (check *Checker) unary(x *operand, e *ast.UnaryExpr) {
130 check.expr(nil, x, e.X)
131 if !x.isValid() {
132 return
133 }
134
135 op := e.Op
136 switch op {
137 case token.AND:
138
139
140 if _, ok := ast.Unparen(e.X).(*ast.CompositeLit); !ok && x.mode() != variable {
141 check.errorf(x, UnaddressableOperand, invalidOp+"cannot take address of %s", x)
142 x.invalidate()
143 return
144 }
145 x.mode_ = value
146 x.typ_ = &Pointer{base: x.typ()}
147 return
148
149 case token.ARROW:
150
151 if elem := check.chanElem(x, x, true); elem != nil && check.isComplete(elem) {
152 x.mode_ = commaok
153 x.typ_ = elem
154 check.hasCallOrRecv = true
155 return
156 }
157 x.invalidate()
158 return
159
160 case token.TILDE:
161
162 if !allInteger(x.typ()) {
163 check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint")
164 x.invalidate()
165 return
166 }
167 check.error(e, UndefinedOp, "cannot use ~ outside of interface or type constraint (use ^ for bitwise complement)")
168 op = token.XOR
169 }
170
171 if !check.op(unaryOpPredicates, x, op) {
172 x.invalidate()
173 return
174 }
175
176 if x.mode() == constant_ {
177 if x.val.Kind() == constant.Unknown {
178
179 return
180 }
181 var prec uint
182 if isUnsigned(x.typ()) {
183 prec = uint(check.conf.sizeof(x.typ()) * 8)
184 }
185 x.val = constant.UnaryOp(op, x.val, prec)
186 x.expr = e
187 check.overflow(x, opPos(x.expr))
188 return
189 }
190
191 x.mode_ = value
192
193 }
194
195
196
197
198 func (check *Checker) chanElem(pos positioner, x *operand, recv bool) Type {
199 u, err := commonUnder(x.typ(), func(t, u Type) *typeError {
200 if u == nil {
201 return typeErrorf("no specific channel type")
202 }
203 ch, _ := u.(*Chan)
204 if ch == nil {
205 return typeErrorf("non-channel %s", t)
206 }
207 if recv && ch.dir == SendOnly {
208 return typeErrorf("send-only channel %s", t)
209 }
210 if !recv && ch.dir == RecvOnly {
211 return typeErrorf("receive-only channel %s", t)
212 }
213 return nil
214 })
215
216 if u != nil {
217 return u.(*Chan).elem
218 }
219
220 cause := err.format(check)
221 if recv {
222 if isTypeParam(x.typ()) {
223 check.errorf(pos, InvalidReceive, invalidOp+"cannot receive from %s: %s", x, cause)
224 } else {
225
226 check.errorf(pos, InvalidReceive, invalidOp+"cannot receive from %s %s", cause, x)
227 }
228 } else {
229 if isTypeParam(x.typ()) {
230 check.errorf(pos, InvalidSend, invalidOp+"cannot send to %s: %s", x, cause)
231 } else {
232
233 check.errorf(pos, InvalidSend, invalidOp+"cannot send to %s %s", cause, x)
234 }
235 }
236 return nil
237 }
238
239 func isShift(op token.Token) bool {
240 return op == token.SHL || op == token.SHR
241 }
242
243 func isComparison(op token.Token) bool {
244
245 switch op {
246 case token.EQL, token.NEQ, token.LSS, token.LEQ, token.GTR, token.GEQ:
247 return true
248 }
249 return false
250 }
251
252
253
254
255
256
257
258
259
260
261 func (check *Checker) updateExprType(x ast.Expr, typ Type, final bool) {
262 old, found := check.untyped[x]
263 if !found {
264 return
265 }
266
267
268 switch x := x.(type) {
269 case *ast.BadExpr,
270 *ast.FuncLit,
271 *ast.CompositeLit,
272 *ast.IndexExpr,
273 *ast.SliceExpr,
274 *ast.TypeAssertExpr,
275 *ast.StarExpr,
276 *ast.KeyValueExpr,
277 *ast.ArrayType,
278 *ast.StructType,
279 *ast.FuncType,
280 *ast.InterfaceType,
281 *ast.MapType,
282 *ast.ChanType:
283
284
285
286 if debug {
287 check.dump("%v: found old type(%s): %s (new: %s)", x.Pos(), x, old.typ, typ)
288 panic("unreachable")
289 }
290 return
291
292 case *ast.CallExpr:
293
294
295
296
297 case *ast.Ident, *ast.BasicLit, *ast.SelectorExpr:
298
299
300
301
302 case *ast.ParenExpr:
303 check.updateExprType(x.X, typ, final)
304
305 case *ast.UnaryExpr:
306
307
308
309
310
311 if old.val != nil {
312 break
313 }
314 check.updateExprType(x.X, typ, final)
315
316 case *ast.BinaryExpr:
317 if old.val != nil {
318 break
319 }
320 if isComparison(x.Op) {
321
322
323 } else if isShift(x.Op) {
324
325
326 check.updateExprType(x.X, typ, final)
327 } else {
328
329 check.updateExprType(x.X, typ, final)
330 check.updateExprType(x.Y, typ, final)
331 }
332
333 default:
334 panic("unreachable")
335 }
336
337
338
339 if !final && isUntyped(typ) {
340 old.typ = typ.Underlying().(*Basic)
341 check.untyped[x] = old
342 return
343 }
344
345
346
347 delete(check.untyped, x)
348
349 if old.isLhs {
350
351
352
353 if !allInteger(typ) {
354 check.errorf(x, InvalidShiftOperand, invalidOp+"shifted operand %s (type %s) must be integer", x, typ)
355 return
356 }
357
358
359
360 }
361 if old.val != nil {
362
363 c := operand{old.mode, x, old.typ, old.val, 0}
364 check.convertUntyped(&c, typ)
365 if !c.isValid() {
366 return
367 }
368 }
369
370
371 check.recordTypeAndValue(x, old.mode, typ, old.val)
372 }
373
374
375 func (check *Checker) updateExprVal(x ast.Expr, val constant.Value) {
376 if info, ok := check.untyped[x]; ok {
377 info.val = val
378 check.untyped[x] = info
379 }
380 }
381
382
383
384
385
386
387
388 func (check *Checker) implicitTypeAndValue(x *operand, target Type) (Type, constant.Value, Code) {
389 if !x.isValid() || isTyped(x.typ()) || !isValid(target) {
390 return x.typ(), nil, 0
391 }
392
393
394 if isUntyped(target) {
395
396 if m := maxType(x.typ(), target); m != nil {
397 return m, nil, 0
398 }
399 return nil, nil, InvalidUntypedConversion
400 }
401
402 switch u := target.Underlying().(type) {
403 case *Basic:
404 if x.mode() == constant_ {
405 v, code := check.representation(x, u)
406 if code != 0 {
407 return nil, nil, code
408 }
409 return target, v, code
410 }
411
412
413
414
415 switch x.typ().(*Basic).kind {
416 case UntypedBool:
417 if !isBoolean(target) {
418 return nil, nil, InvalidUntypedConversion
419 }
420 case UntypedInt, UntypedRune, UntypedFloat, UntypedComplex:
421 if !isNumeric(target) {
422 return nil, nil, InvalidUntypedConversion
423 }
424 case UntypedString:
425
426
427
428 if !isString(target) {
429 return nil, nil, InvalidUntypedConversion
430 }
431 case UntypedNil:
432
433 if !hasNil(target) {
434 return nil, nil, InvalidUntypedConversion
435 }
436
437 return Typ[UntypedNil], nil, 0
438 default:
439 return nil, nil, InvalidUntypedConversion
440 }
441 case *Interface:
442 if isTypeParam(target) {
443 if !underIs(target, func(u Type) bool {
444 if u == nil {
445 return false
446 }
447 t, _, _ := check.implicitTypeAndValue(x, u)
448 return t != nil
449 }) {
450 return nil, nil, InvalidUntypedConversion
451 }
452
453 if x.isNil() {
454 return Typ[UntypedNil], nil, 0
455 }
456 break
457 }
458
459
460
461
462 if x.isNil() {
463 return Typ[UntypedNil], nil, 0
464 }
465
466 if !u.Empty() {
467 return nil, nil, InvalidUntypedConversion
468 }
469 return Default(x.typ()), nil, 0
470 case *Pointer, *Signature, *Slice, *Map, *Chan:
471 if !x.isNil() {
472 return nil, nil, InvalidUntypedConversion
473 }
474
475 return Typ[UntypedNil], nil, 0
476 default:
477 return nil, nil, InvalidUntypedConversion
478 }
479 return target, nil, 0
480 }
481
482
483 func (check *Checker) comparison(x, y *operand, op token.Token, switchCase bool) {
484
485 if !isValid(x.typ()) || !isValid(y.typ()) {
486 x.invalidate()
487 return
488 }
489
490 if switchCase {
491 op = token.EQL
492 }
493
494 errOp := x
495 cause := ""
496
497
498
499 code := MismatchedTypes
500 ok, _ := x.assignableTo(check, y.typ(), nil)
501 if !ok {
502 ok, _ = y.assignableTo(check, x.typ(), nil)
503 }
504 if !ok {
505
506
507
508 errOp = y
509 cause = check.sprintf("mismatched types %s and %s", x.typ(), y.typ())
510 goto Error
511 }
512
513
514 code = UndefinedOp
515 switch op {
516 case token.EQL, token.NEQ:
517
518 switch {
519 case x.isNil() || y.isNil():
520
521 typ := x.typ()
522 if x.isNil() {
523 typ = y.typ()
524 }
525 if !hasNil(typ) {
526
527
528
529
530 errOp = y
531 goto Error
532 }
533
534 case !Comparable(x.typ()):
535 errOp = x
536 cause = check.incomparableCause(x.typ())
537 goto Error
538
539 case !Comparable(y.typ()):
540 errOp = y
541 cause = check.incomparableCause(y.typ())
542 goto Error
543 }
544
545 case token.LSS, token.LEQ, token.GTR, token.GEQ:
546
547 switch {
548 case !allOrdered(x.typ()):
549 errOp = x
550 goto Error
551 case !allOrdered(y.typ()):
552 errOp = y
553 goto Error
554 }
555
556 default:
557 panic("unreachable")
558 }
559
560
561 if x.mode() == constant_ && y.mode() == constant_ {
562 x.val = constant.MakeBool(constant.Compare(x.val, op, y.val))
563
564
565 } else {
566 x.mode_ = value
567
568
569
570
571 check.updateExprType(x.expr, Default(x.typ()), true)
572 check.updateExprType(y.expr, Default(y.typ()), true)
573 }
574
575
576
577 x.typ_ = Typ[UntypedBool]
578 return
579
580 Error:
581
582 if cause == "" {
583 if isTypeParam(x.typ()) || isTypeParam(y.typ()) {
584
585 if !isTypeParam(x.typ()) {
586 errOp = y
587 }
588 cause = check.sprintf("type parameter %s cannot use operator %s", errOp.typ(), op)
589 } else {
590
591 what := compositeKind(errOp.typ())
592 if what == "" {
593 what = check.sprintf("%s", errOp.typ())
594 }
595 cause = check.sprintf("operator %s not defined on %s", op, what)
596 }
597 }
598 if switchCase {
599 check.errorf(x, code, "invalid case %s in switch on %s (%s)", x.expr, y.expr, cause)
600 } else {
601 check.errorf(errOp, code, invalidOp+"%s %s %s (%s)", x.expr, op, y.expr, cause)
602 }
603 x.invalidate()
604 }
605
606
607
608 func (check *Checker) incomparableCause(typ Type) string {
609 switch typ.Underlying().(type) {
610 case *Slice, *Signature, *Map:
611 return compositeKind(typ) + " can only be compared to nil"
612 }
613
614 return comparableType(typ, true, nil).format(check)
615 }
616
617
618 func (check *Checker) shift(x, y *operand, e ast.Expr, op token.Token) {
619
620
621 var xval constant.Value
622 if x.mode() == constant_ {
623 xval = constant.ToInt(x.val)
624 }
625
626 if allInteger(x.typ()) || isUntyped(x.typ()) && xval != nil && xval.Kind() == constant.Int {
627
628
629 } else {
630
631 check.errorf(x, InvalidShiftOperand, invalidOp+"shifted operand %s must be integer", x)
632 x.invalidate()
633 return
634 }
635
636
637
638
639
640
641 var yval constant.Value
642 if y.mode() == constant_ {
643
644 yval = constant.ToInt(y.val)
645 if yval.Kind() == constant.Int && constant.Sign(yval) < 0 {
646 check.errorf(y, InvalidShiftCount, invalidOp+"negative shift count %s", y)
647 x.invalidate()
648 return
649 }
650
651 if isUntyped(y.typ()) {
652
653
654 check.representable(y, Typ[Uint])
655 if !y.isValid() {
656 x.invalidate()
657 return
658 }
659 }
660 } else {
661
662 switch {
663 case allInteger(y.typ()):
664 if !allUnsigned(y.typ()) && !check.verifyVersionf(y, go1_13, invalidOp+"signed shift count %s", y) {
665 x.invalidate()
666 return
667 }
668 case isUntyped(y.typ()):
669
670
671 check.convertUntyped(y, Typ[Uint])
672 if !y.isValid() {
673 x.invalidate()
674 return
675 }
676 default:
677 check.errorf(y, InvalidShiftCount, invalidOp+"shift count %s must be integer", y)
678 x.invalidate()
679 return
680 }
681 }
682
683 if x.mode() == constant_ {
684 if y.mode() == constant_ {
685
686 if x.val.Kind() == constant.Unknown || y.val.Kind() == constant.Unknown {
687 x.val = constant.MakeUnknown()
688
689 if !isInteger(x.typ()) {
690 x.typ_ = Typ[UntypedInt]
691 }
692 return
693 }
694
695 const shiftBound = 1023 - 1 + 52
696 s, ok := constant.Uint64Val(yval)
697 if !ok || s > shiftBound {
698 check.errorf(y, InvalidShiftCount, invalidOp+"invalid shift count %s", y)
699 x.invalidate()
700 return
701 }
702
703
704
705
706 if !isInteger(x.typ()) {
707 x.typ_ = Typ[UntypedInt]
708 }
709
710 x.val = constant.Shift(xval, op, uint(s))
711 x.expr = e
712 check.overflow(x, opPos(x.expr))
713 return
714 }
715
716
717 if isUntyped(x.typ()) {
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737 if info, found := check.untyped[x.expr]; found {
738 info.isLhs = true
739 check.untyped[x.expr] = info
740 }
741
742 x.mode_ = value
743 return
744 }
745 }
746
747
748 if !allInteger(x.typ()) {
749 check.errorf(x, InvalidShiftOperand, invalidOp+"shifted operand %s must be integer", x)
750 x.invalidate()
751 return
752 }
753
754 x.mode_ = value
755 }
756
757 var binaryOpPredicates opPredicates
758
759 func init() {
760
761 binaryOpPredicates = opPredicates{
762 token.ADD: allNumericOrString,
763 token.SUB: allNumeric,
764 token.MUL: allNumeric,
765 token.QUO: allNumeric,
766 token.REM: allInteger,
767
768 token.AND: allInteger,
769 token.OR: allInteger,
770 token.XOR: allInteger,
771 token.AND_NOT: allInteger,
772
773 token.LAND: allBoolean,
774 token.LOR: allBoolean,
775 }
776 }
777
778
779
780 func (check *Checker) binary(x *operand, e ast.Expr, lhs, rhs ast.Expr, op token.Token, opPos token.Pos) {
781 var y operand
782
783 check.expr(nil, x, lhs)
784 check.expr(nil, &y, rhs)
785
786 if !x.isValid() {
787 return
788 }
789 if !y.isValid() {
790 x.invalidate()
791 x.expr = y.expr
792 return
793 }
794
795 if isShift(op) {
796 check.shift(x, &y, e, op)
797 return
798 }
799
800 check.matchTypes(x, &y)
801 if !x.isValid() {
802 return
803 }
804
805 if isComparison(op) {
806 check.comparison(x, &y, op, false)
807 return
808 }
809
810 if !Identical(x.typ(), y.typ()) {
811
812
813 if isValid(x.typ()) && isValid(y.typ()) {
814 var posn positioner = x
815 if e != nil {
816 posn = e
817 }
818 if e != nil {
819 check.errorf(posn, MismatchedTypes, invalidOp+"%s (mismatched types %s and %s)", e, x.typ(), y.typ())
820 } else {
821 check.errorf(posn, MismatchedTypes, invalidOp+"%s %s= %s (mismatched types %s and %s)", lhs, op, rhs, x.typ(), y.typ())
822 }
823 }
824 x.invalidate()
825 return
826 }
827
828 if !check.op(binaryOpPredicates, x, op) {
829 x.invalidate()
830 return
831 }
832
833 if op == token.QUO || op == token.REM {
834
835 if (x.mode() == constant_ || allInteger(x.typ())) && y.mode() == constant_ && constant.Sign(y.val) == 0 {
836 check.error(&y, DivByZero, invalidOp+"division by zero")
837 x.invalidate()
838 return
839 }
840
841
842 if x.mode() == constant_ && y.mode() == constant_ && isComplex(x.typ()) {
843 re, im := constant.Real(y.val), constant.Imag(y.val)
844 re2, im2 := constant.BinaryOp(re, token.MUL, re), constant.BinaryOp(im, token.MUL, im)
845 if constant.Sign(re2) == 0 && constant.Sign(im2) == 0 {
846 check.error(&y, DivByZero, invalidOp+"division by zero")
847 x.invalidate()
848 return
849 }
850 }
851 }
852
853 if x.mode() == constant_ && y.mode() == constant_ {
854
855 if x.val.Kind() == constant.Unknown || y.val.Kind() == constant.Unknown {
856 x.val = constant.MakeUnknown()
857
858 return
859 }
860
861 if op == token.QUO && isInteger(x.typ()) {
862 op = token.QUO_ASSIGN
863 }
864 x.val = constant.BinaryOp(x.val, op, y.val)
865 x.expr = e
866 check.overflow(x, opPos)
867 return
868 }
869
870 x.mode_ = value
871
872 }
873
874
875
876 func (check *Checker) matchTypes(x, y *operand) {
877
878
879
880
881
882
883
884
885
886 mayConvert := func(x, y *operand) bool {
887
888 if isTyped(x.typ()) && isTyped(y.typ()) {
889 return false
890 }
891
892 if allNumeric(x.typ()) != allNumeric(y.typ()) {
893 return false
894 }
895
896
897
898
899 if isNonTypeParamInterface(x.typ()) || isNonTypeParamInterface(y.typ()) {
900 return true
901 }
902
903 if allBoolean(x.typ()) != allBoolean(y.typ()) {
904 return false
905 }
906
907 if allString(x.typ()) != allString(y.typ()) {
908 return false
909 }
910
911 if x.isNil() {
912 return hasNil(y.typ())
913 }
914 if y.isNil() {
915 return hasNil(x.typ())
916 }
917
918
919 if isPointer(x.typ()) || isPointer(y.typ()) {
920 return false
921 }
922 return true
923 }
924
925 if mayConvert(x, y) {
926 check.convertUntyped(x, y.typ())
927 if !x.isValid() {
928 return
929 }
930 check.convertUntyped(y, x.typ())
931 if !y.isValid() {
932 x.invalidate()
933 return
934 }
935 }
936 }
937
938
939
940 type exprKind int
941
942 const (
943 conversion exprKind = iota
944 expression
945 statement
946 )
947
948
949 type target struct {
950 typ Type
951
952
953
954 desc string
955 hint bool
956 }
957
958
959
960 func newTarget(typ Type, desc string) *target {
961 if typ != nil {
962 return &target{typ, desc, false}
963 }
964 return nil
965 }
966
967
968 func newHint(typ Type, desc string) *target {
969 if typ != nil {
970 return &target{typ, desc, true}
971 }
972 return nil
973 }
974
975
976
977 func (T *target) sig() Type {
978 if T != nil {
979 if u, _ := commonUnder(T.typ, nil); u != nil {
980 if _, ok := u.(*Signature); ok {
981 return T.typ
982 }
983 }
984 }
985 return nil
986 }
987
988
989 func (T *target) String() string {
990 if T != nil {
991 return sprintf(nil, nil, true, "target{%s, %q}", T.typ, T.desc)
992 }
993 return "no target"
994 }
995
996
997
998
999
1000
1001
1002
1003
1004
1005 func (check *Checker) rawExpr(T *target, x *operand, e ast.Expr, allowGeneric bool) exprKind {
1006 if check.conf._Trace {
1007 check.trace(e.Pos(), "-- expr %s", e)
1008 check.indent++
1009 defer func() {
1010 check.indent--
1011 check.trace(e.Pos(), "=> %s", x)
1012 }()
1013 }
1014
1015 kind := check.exprInternal(T, x, e)
1016
1017 if !allowGeneric {
1018 check.nonGeneric(T, x)
1019 }
1020
1021 check.record(x)
1022
1023 return kind
1024 }
1025
1026
1027
1028
1029 func (check *Checker) nonGeneric(T *target, x *operand) {
1030 if !x.isValid() || x.mode() == novalue {
1031 return
1032 }
1033 var what string
1034 switch t := x.typ().(type) {
1035 case *Alias, *Named:
1036 if isGeneric(t) {
1037 what = "type"
1038 }
1039 case *Signature:
1040 if t.tparams != nil {
1041 if enableReverseTypeInference && T.sig() != nil {
1042 check.funcInst(T, x.Pos(), x, nil, true)
1043 return
1044 }
1045 what = "function"
1046 }
1047 }
1048 if what != "" {
1049 check.errorf(x.expr, WrongTypeArgCount, "cannot use generic %s %s without instantiation", what, x.expr)
1050 x.invalidate()
1051 x.typ_ = Typ[Invalid]
1052 }
1053 }
1054
1055
1056
1057
1058 func (check *Checker) exprInternal(T *target, x *operand, e ast.Expr) exprKind {
1059
1060
1061 x.invalidate()
1062 x.typ_ = Typ[Invalid]
1063
1064 switch e := e.(type) {
1065 case *ast.BadExpr:
1066 goto Error
1067
1068 case *ast.Ident:
1069 check.ident(x, e, false)
1070
1071 case *ast.Ellipsis:
1072
1073 check.error(e, InvalidSyntaxTree, "invalid use of ...")
1074 goto Error
1075
1076 case *ast.BasicLit:
1077 check.basicLit(x, e)
1078 if !x.isValid() {
1079 goto Error
1080 }
1081
1082 case *ast.FuncLit:
1083 check.funcLit(x, e)
1084 if !x.isValid() {
1085 goto Error
1086 }
1087
1088 case *ast.CompositeLit:
1089 check.compositeLit(T, x, e)
1090 if !x.isValid() {
1091 goto Error
1092 }
1093
1094 case *ast.ParenExpr:
1095
1096 kind := check.rawExpr(nil, x, e.X, false)
1097 x.expr = e
1098 return kind
1099
1100 case *ast.SelectorExpr:
1101 check.selector(x, e, false)
1102
1103 case *ast.IndexExpr, *ast.IndexListExpr:
1104 ix := unpackIndexedExpr(e)
1105 if check.indexExpr(x, ix) {
1106 if !enableReverseTypeInference {
1107 T = nil
1108 }
1109 check.funcInst(T, e.Pos(), x, ix, true)
1110 }
1111 if !x.isValid() {
1112 goto Error
1113 }
1114
1115 case *ast.SliceExpr:
1116 check.sliceExpr(x, e)
1117 if !x.isValid() {
1118 goto Error
1119 }
1120
1121 case *ast.TypeAssertExpr:
1122 check.expr(nil, x, e.X)
1123 if !x.isValid() {
1124 goto Error
1125 }
1126
1127 if e.Type == nil {
1128
1129
1130 check.error(e, BadTypeKeyword, "use of .(type) outside type switch")
1131 goto Error
1132 }
1133 if isTypeParam(x.typ()) {
1134 check.errorf(x, InvalidAssert, invalidOp+"cannot use type assertion on type parameter value %s", x)
1135 goto Error
1136 }
1137 if _, ok := x.typ().Underlying().(*Interface); !ok {
1138 check.errorf(x, InvalidAssert, invalidOp+"%s is not an interface", x)
1139 goto Error
1140 }
1141 T := check.varType(e.Type)
1142 if !isValid(T) {
1143 goto Error
1144 }
1145
1146 if !check.isComplete(T) {
1147 goto Error
1148 }
1149 check.typeAssertion(e, x, T, false)
1150 x.mode_ = commaok
1151 x.typ_ = T
1152
1153 case *ast.CallExpr:
1154 return check.callExpr(x, e)
1155
1156 case *ast.StarExpr:
1157 check.exprOrType(x, e.X, false)
1158 switch x.mode() {
1159 case invalid:
1160 goto Error
1161 case typexpr:
1162 check.validVarType(e.X, x.typ())
1163 x.typ_ = &Pointer{base: x.typ()}
1164 default:
1165 var base Type
1166 if !underIs(x.typ(), func(u Type) bool {
1167 p, _ := u.(*Pointer)
1168 if p == nil {
1169 check.errorf(x, InvalidIndirection, invalidOp+"cannot indirect %s", x)
1170 return false
1171 }
1172 if base != nil && !Identical(p.base, base) {
1173 check.errorf(x, InvalidIndirection, invalidOp+"pointers of %s must have identical base types", x)
1174 return false
1175 }
1176 base = p.base
1177 return true
1178 }) {
1179 goto Error
1180 }
1181
1182 if !check.isComplete(base) {
1183 goto Error
1184 }
1185 x.mode_ = variable
1186 x.typ_ = base
1187 }
1188
1189 case *ast.UnaryExpr:
1190 check.unary(x, e)
1191 if !x.isValid() {
1192 goto Error
1193 }
1194 if e.Op == token.ARROW {
1195 x.expr = e
1196 return statement
1197 }
1198
1199 case *ast.BinaryExpr:
1200 check.binary(x, e, e.X, e.Y, e.Op, e.OpPos)
1201 if !x.isValid() {
1202 goto Error
1203 }
1204
1205 case *ast.KeyValueExpr:
1206
1207 check.error(e, InvalidSyntaxTree, "no key:value expected")
1208 goto Error
1209
1210 case *ast.ArrayType, *ast.StructType, *ast.FuncType,
1211 *ast.InterfaceType, *ast.MapType, *ast.ChanType:
1212 x.mode_ = typexpr
1213 x.typ_ = check.typ(e)
1214
1215
1216
1217
1218
1219
1220 default:
1221 panic(fmt.Sprintf("%s: unknown expression type %T", check.fset.Position(e.Pos()), e))
1222 }
1223
1224
1225 x.expr = e
1226 return expression
1227
1228 Error:
1229 x.invalidate()
1230 x.expr = e
1231 return statement
1232 }
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242 func keyVal(x constant.Value) any {
1243 switch x.Kind() {
1244 case constant.Complex:
1245 f := constant.ToFloat(x)
1246 if f.Kind() != constant.Float {
1247 r, _ := constant.Float64Val(constant.Real(x))
1248 i, _ := constant.Float64Val(constant.Imag(x))
1249 return complex(r, i)
1250 }
1251 x = f
1252 fallthrough
1253 case constant.Float:
1254 i := constant.ToInt(x)
1255 if i.Kind() != constant.Int {
1256 v, _ := constant.Float64Val(x)
1257 return v
1258 }
1259 x = i
1260 fallthrough
1261 case constant.Int:
1262 if v, ok := constant.Int64Val(x); ok {
1263 return v
1264 }
1265 if v, ok := constant.Uint64Val(x); ok {
1266 return v
1267 }
1268 case constant.String:
1269 return constant.StringVal(x)
1270 case constant.Bool:
1271 return constant.BoolVal(x)
1272 }
1273 return x
1274 }
1275
1276
1277 func (check *Checker) typeAssertion(e ast.Expr, x *operand, T Type, typeSwitch bool) {
1278 var cause string
1279 if check.assertableTo(x.typ(), T, &cause) {
1280 return
1281 }
1282
1283 if typeSwitch {
1284 check.errorf(e, ImpossibleAssert, "impossible type switch case: %s\n\t%s cannot have dynamic type %s %s", e, x, T, cause)
1285 return
1286 }
1287
1288 check.errorf(e, ImpossibleAssert, "impossible type assertion: %s\n\t%s does not implement %s %s", e, T, x.typ(), cause)
1289 }
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299 func (check *Checker) expr(T *target, x *operand, e ast.Expr) {
1300 check.rawExpr(T, x, e, false)
1301 check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
1302 check.singleValue(x)
1303 }
1304
1305
1306 func (check *Checker) genericExpr(T *target, x *operand, e ast.Expr) {
1307 check.rawExpr(T, x, e, true)
1308 check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
1309 check.singleValue(x)
1310 }
1311
1312
1313
1314
1315
1316
1317 func (check *Checker) multiExpr(e ast.Expr, allowCommaOk bool) (list []*operand, commaOk bool) {
1318 var x operand
1319 check.rawExpr(nil, &x, e, false)
1320 check.exclude(&x, 1<<novalue|1<<builtin|1<<typexpr)
1321
1322 if t, ok := x.typ().(*Tuple); ok && x.isValid() {
1323
1324 list = make([]*operand, t.Len())
1325 for i, v := range t.vars {
1326
1327 dummy := ast.NewIdent(nth(i+1, "function result"))
1328 dummy.NamePos = e.Pos()
1329 list[i] = &operand{mode_: value, expr: dummy, typ_: v.typ}
1330 }
1331 return
1332 }
1333
1334
1335 list = []*operand{&x}
1336 if allowCommaOk && (x.mode() == mapindex || x.mode() == commaok || x.mode() == commaerr) {
1337 var what string = "ok value of (comma, ok) expression"
1338 var typ Type = Typ[UntypedBool]
1339 if x.mode() == commaerr {
1340 what = "err value of (comma, err) expression"
1341 typ = universeError
1342 }
1343
1344 dummy := ast.NewIdent(what)
1345 dummy.NamePos = e.Pos()
1346 x2 := &operand{mode_: value, expr: dummy, typ_: typ}
1347 list = append(list, x2)
1348 commaOk = true
1349 }
1350
1351 return
1352 }
1353
1354
1355
1356 func nth(n int, what string) string {
1357 var ext string
1358 switch n {
1359 case 1:
1360 ext = "st"
1361 case 2:
1362 ext = "nd"
1363 case 3:
1364 ext = "rd"
1365 default:
1366 ext = "th"
1367 }
1368 return fmt.Sprintf("%d%s %s", n, ext, what)
1369 }
1370
1371
1372
1373
1374
1375
1376 func (check *Checker) exprOrType(x *operand, e ast.Expr, allowGeneric bool) {
1377 check.rawExpr(nil, x, e, allowGeneric)
1378 check.exclude(x, 1<<novalue)
1379 check.singleValue(x)
1380 }
1381
1382
1383
1384 func (check *Checker) exclude(x *operand, modeset uint) {
1385 if modeset&(1<<x.mode()) != 0 {
1386 var msg string
1387 var code Code
1388 switch x.mode() {
1389 case novalue:
1390 if modeset&(1<<typexpr) != 0 {
1391 msg = "%s used as value"
1392 } else {
1393 msg = "%s used as value or type"
1394 }
1395 code = TooManyValues
1396 case builtin:
1397 msg = "%s must be called"
1398 code = UncalledBuiltin
1399 case typexpr:
1400 msg = "%s is not an expression"
1401 code = NotAnExpr
1402 default:
1403 panic("unreachable")
1404 }
1405 check.errorf(x, code, msg, x)
1406 x.invalidate()
1407 }
1408 }
1409
1410
1411 func (check *Checker) singleValue(x *operand) {
1412 if x.mode() == value {
1413
1414 if t, ok := x.typ().(*Tuple); ok {
1415 assert(t.Len() != 1)
1416 check.errorf(x, TooManyValues, "multiple-value %s in single-value context", x)
1417 x.invalidate()
1418 }
1419 }
1420 }
1421
View as plain text