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
950 type target struct {
951 sig *Signature
952 desc string
953 }
954
955
956
957 func newTarget(typ Type, desc string) *target {
958 if typ != nil {
959 if sig, _ := typ.Underlying().(*Signature); sig != nil {
960 return &target{sig, desc}
961 }
962 }
963 return nil
964 }
965
966
967
968
969
970
971
972
973 func (check *Checker) rawExpr(T *target, x *operand, e ast.Expr, hint Type, allowGeneric bool) exprKind {
974 if check.conf._Trace {
975 check.trace(e.Pos(), "-- expr %s", e)
976 check.indent++
977 defer func() {
978 check.indent--
979 check.trace(e.Pos(), "=> %s", x)
980 }()
981 }
982
983 kind := check.exprInternal(T, x, e, hint)
984
985 if !allowGeneric {
986 check.nonGeneric(T, x)
987 }
988
989 check.record(x)
990
991 return kind
992 }
993
994
995
996
997 func (check *Checker) nonGeneric(T *target, x *operand) {
998 if !x.isValid() || x.mode() == novalue {
999 return
1000 }
1001 var what string
1002 switch t := x.typ().(type) {
1003 case *Alias, *Named:
1004 if isGeneric(t) {
1005 what = "type"
1006 }
1007 case *Signature:
1008 if t.tparams != nil {
1009 if enableReverseTypeInference && T != nil {
1010 check.funcInst(T, x.Pos(), x, nil, true)
1011 return
1012 }
1013 what = "function"
1014 }
1015 }
1016 if what != "" {
1017 check.errorf(x.expr, WrongTypeArgCount, "cannot use generic %s %s without instantiation", what, x.expr)
1018 x.invalidate()
1019 x.typ_ = Typ[Invalid]
1020 }
1021 }
1022
1023
1024
1025
1026 func (check *Checker) exprInternal(T *target, x *operand, e ast.Expr, hint Type) exprKind {
1027
1028
1029 x.invalidate()
1030 x.typ_ = Typ[Invalid]
1031
1032 switch e := e.(type) {
1033 case *ast.BadExpr:
1034 goto Error
1035
1036 case *ast.Ident:
1037 check.ident(x, e, false)
1038
1039 case *ast.Ellipsis:
1040
1041 check.error(e, InvalidSyntaxTree, "invalid use of ...")
1042 goto Error
1043
1044 case *ast.BasicLit:
1045 check.basicLit(x, e)
1046 if !x.isValid() {
1047 goto Error
1048 }
1049
1050 case *ast.FuncLit:
1051 check.funcLit(x, e)
1052 if !x.isValid() {
1053 goto Error
1054 }
1055
1056 case *ast.CompositeLit:
1057 check.compositeLit(x, e, hint)
1058 if !x.isValid() {
1059 goto Error
1060 }
1061
1062 case *ast.ParenExpr:
1063
1064 kind := check.rawExpr(nil, x, e.X, nil, false)
1065 x.expr = e
1066 return kind
1067
1068 case *ast.SelectorExpr:
1069 check.selector(x, e, false)
1070
1071 case *ast.IndexExpr, *ast.IndexListExpr:
1072 ix := unpackIndexedExpr(e)
1073 if check.indexExpr(x, ix) {
1074 if !enableReverseTypeInference {
1075 T = nil
1076 }
1077 check.funcInst(T, e.Pos(), x, ix, true)
1078 }
1079 if !x.isValid() {
1080 goto Error
1081 }
1082
1083 case *ast.SliceExpr:
1084 check.sliceExpr(x, e)
1085 if !x.isValid() {
1086 goto Error
1087 }
1088
1089 case *ast.TypeAssertExpr:
1090 check.expr(nil, x, e.X)
1091 if !x.isValid() {
1092 goto Error
1093 }
1094
1095 if e.Type == nil {
1096
1097
1098 check.error(e, BadTypeKeyword, "use of .(type) outside type switch")
1099 goto Error
1100 }
1101 if isTypeParam(x.typ()) {
1102 check.errorf(x, InvalidAssert, invalidOp+"cannot use type assertion on type parameter value %s", x)
1103 goto Error
1104 }
1105 if _, ok := x.typ().Underlying().(*Interface); !ok {
1106 check.errorf(x, InvalidAssert, invalidOp+"%s is not an interface", x)
1107 goto Error
1108 }
1109 T := check.varType(e.Type)
1110 if !isValid(T) {
1111 goto Error
1112 }
1113
1114 if !check.isComplete(T) {
1115 goto Error
1116 }
1117 check.typeAssertion(e, x, T, false)
1118 x.mode_ = commaok
1119 x.typ_ = T
1120
1121 case *ast.CallExpr:
1122 return check.callExpr(x, e)
1123
1124 case *ast.StarExpr:
1125 check.exprOrType(x, e.X, false)
1126 switch x.mode() {
1127 case invalid:
1128 goto Error
1129 case typexpr:
1130 check.validVarType(e.X, x.typ())
1131 x.typ_ = &Pointer{base: x.typ()}
1132 default:
1133 var base Type
1134 if !underIs(x.typ(), func(u Type) bool {
1135 p, _ := u.(*Pointer)
1136 if p == nil {
1137 check.errorf(x, InvalidIndirection, invalidOp+"cannot indirect %s", x)
1138 return false
1139 }
1140 if base != nil && !Identical(p.base, base) {
1141 check.errorf(x, InvalidIndirection, invalidOp+"pointers of %s must have identical base types", x)
1142 return false
1143 }
1144 base = p.base
1145 return true
1146 }) {
1147 goto Error
1148 }
1149
1150 if !check.isComplete(base) {
1151 goto Error
1152 }
1153 x.mode_ = variable
1154 x.typ_ = base
1155 }
1156
1157 case *ast.UnaryExpr:
1158 check.unary(x, e)
1159 if !x.isValid() {
1160 goto Error
1161 }
1162 if e.Op == token.ARROW {
1163 x.expr = e
1164 return statement
1165 }
1166
1167 case *ast.BinaryExpr:
1168 check.binary(x, e, e.X, e.Y, e.Op, e.OpPos)
1169 if !x.isValid() {
1170 goto Error
1171 }
1172
1173 case *ast.KeyValueExpr:
1174
1175 check.error(e, InvalidSyntaxTree, "no key:value expected")
1176 goto Error
1177
1178 case *ast.ArrayType, *ast.StructType, *ast.FuncType,
1179 *ast.InterfaceType, *ast.MapType, *ast.ChanType:
1180 x.mode_ = typexpr
1181 x.typ_ = check.typ(e)
1182
1183
1184
1185
1186
1187
1188 default:
1189 panic(fmt.Sprintf("%s: unknown expression type %T", check.fset.Position(e.Pos()), e))
1190 }
1191
1192
1193 x.expr = e
1194 return expression
1195
1196 Error:
1197 x.invalidate()
1198 x.expr = e
1199 return statement
1200 }
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210 func keyVal(x constant.Value) any {
1211 switch x.Kind() {
1212 case constant.Complex:
1213 f := constant.ToFloat(x)
1214 if f.Kind() != constant.Float {
1215 r, _ := constant.Float64Val(constant.Real(x))
1216 i, _ := constant.Float64Val(constant.Imag(x))
1217 return complex(r, i)
1218 }
1219 x = f
1220 fallthrough
1221 case constant.Float:
1222 i := constant.ToInt(x)
1223 if i.Kind() != constant.Int {
1224 v, _ := constant.Float64Val(x)
1225 return v
1226 }
1227 x = i
1228 fallthrough
1229 case constant.Int:
1230 if v, ok := constant.Int64Val(x); ok {
1231 return v
1232 }
1233 if v, ok := constant.Uint64Val(x); ok {
1234 return v
1235 }
1236 case constant.String:
1237 return constant.StringVal(x)
1238 case constant.Bool:
1239 return constant.BoolVal(x)
1240 }
1241 return x
1242 }
1243
1244
1245 func (check *Checker) typeAssertion(e ast.Expr, x *operand, T Type, typeSwitch bool) {
1246 var cause string
1247 if check.assertableTo(x.typ(), T, &cause) {
1248 return
1249 }
1250
1251 if typeSwitch {
1252 check.errorf(e, ImpossibleAssert, "impossible type switch case: %s\n\t%s cannot have dynamic type %s %s", e, x, T, cause)
1253 return
1254 }
1255
1256 check.errorf(e, ImpossibleAssert, "impossible type assertion: %s\n\t%s does not implement %s %s", e, T, x.typ(), cause)
1257 }
1258
1259
1260
1261
1262
1263
1264 func (check *Checker) expr(T *target, x *operand, e ast.Expr) {
1265 check.rawExpr(T, x, e, nil, false)
1266 check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
1267 check.singleValue(x)
1268 }
1269
1270
1271 func (check *Checker) genericExpr(x *operand, e ast.Expr) {
1272 check.rawExpr(nil, x, e, nil, true)
1273 check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
1274 check.singleValue(x)
1275 }
1276
1277
1278
1279
1280
1281
1282 func (check *Checker) multiExpr(e ast.Expr, allowCommaOk bool) (list []*operand, commaOk bool) {
1283 var x operand
1284 check.rawExpr(nil, &x, e, nil, false)
1285 check.exclude(&x, 1<<novalue|1<<builtin|1<<typexpr)
1286
1287 if t, ok := x.typ().(*Tuple); ok && x.isValid() {
1288
1289 list = make([]*operand, t.Len())
1290 for i, v := range t.vars {
1291 list[i] = &operand{mode_: value, expr: e, typ_: v.typ}
1292 }
1293 return
1294 }
1295
1296
1297 list = []*operand{&x}
1298 if allowCommaOk && (x.mode() == mapindex || x.mode() == commaok || x.mode() == commaerr) {
1299 x2 := &operand{mode_: value, expr: e, typ_: Typ[UntypedBool]}
1300 if x.mode() == commaerr {
1301 x2.typ_ = universeError
1302 }
1303 list = append(list, x2)
1304 commaOk = true
1305 }
1306
1307 return
1308 }
1309
1310
1311
1312
1313 func (check *Checker) exprWithHint(x *operand, e ast.Expr, hint Type) {
1314 assert(hint != nil)
1315 check.rawExpr(nil, x, e, hint, false)
1316 check.exclude(x, 1<<novalue|1<<builtin|1<<typexpr)
1317 check.singleValue(x)
1318 }
1319
1320
1321
1322
1323
1324 func (check *Checker) exprOrType(x *operand, e ast.Expr, allowGeneric bool) {
1325 check.rawExpr(nil, x, e, nil, allowGeneric)
1326 check.exclude(x, 1<<novalue)
1327 check.singleValue(x)
1328 }
1329
1330
1331
1332 func (check *Checker) exclude(x *operand, modeset uint) {
1333 if modeset&(1<<x.mode()) != 0 {
1334 var msg string
1335 var code Code
1336 switch x.mode() {
1337 case novalue:
1338 if modeset&(1<<typexpr) != 0 {
1339 msg = "%s used as value"
1340 } else {
1341 msg = "%s used as value or type"
1342 }
1343 code = TooManyValues
1344 case builtin:
1345 msg = "%s must be called"
1346 code = UncalledBuiltin
1347 case typexpr:
1348 msg = "%s is not an expression"
1349 code = NotAnExpr
1350 default:
1351 panic("unreachable")
1352 }
1353 check.errorf(x, code, msg, x)
1354 x.invalidate()
1355 }
1356 }
1357
1358
1359 func (check *Checker) singleValue(x *operand) {
1360 if x.mode() == value {
1361
1362 if t, ok := x.typ().(*Tuple); ok {
1363 assert(t.Len() != 1)
1364 check.errorf(x, TooManyValues, "multiple-value %s in single-value context", x)
1365 x.invalidate()
1366 }
1367 }
1368 }
1369
View as plain text