@@ -705,6 +705,7 @@ func evconst(n *Node) {
705
705
var rv Val
706
706
var lno src.XPos
707
707
var wr types.EType
708
+ var ctype uint32
708
709
var v Val
709
710
var norig * Node
710
711
var nn * Node
@@ -717,7 +718,13 @@ func evconst(n *Node) {
717
718
v = copyval (v )
718
719
}
719
720
720
- switch uint32 (n .Op )<< 16 | uint32 (v .Ctype ()) {
721
+ // rune values are int values for the purpose of constant folding.
722
+ ctype = uint32 (v .Ctype ())
723
+ if ctype == CTRUNE_ {
724
+ ctype = CTINT_
725
+ }
726
+
727
+ switch uint32 (n .Op )<< 16 | ctype {
721
728
default :
722
729
if ! n .Diag () {
723
730
yyerror ("illegal constant expression %v %v" , n .Op , nl .Type )
@@ -734,24 +741,20 @@ func evconst(n *Node) {
734
741
}
735
742
fallthrough
736
743
case OCONV_ | CTINT_ ,
737
- OCONV_ | CTRUNE_ ,
738
744
OCONV_ | CTFLT_ ,
739
745
OCONV_ | CTCPLX_ ,
740
746
OCONV_ | CTSTR_ ,
741
747
OCONV_ | CTBOOL_ :
742
748
nl = convlit1 (nl , n .Type , true , false )
743
749
v = nl .Val ()
744
750
745
- case OPLUS_ | CTINT_ ,
746
- OPLUS_ | CTRUNE_ :
751
+ case OPLUS_ | CTINT_ :
747
752
break
748
753
749
- case OMINUS_ | CTINT_ ,
750
- OMINUS_ | CTRUNE_ :
754
+ case OMINUS_ | CTINT_ :
751
755
v .U .(* Mpint ).Neg ()
752
756
753
- case OCOM_ | CTINT_ ,
754
- OCOM_ | CTRUNE_ :
757
+ case OCOM_ | CTINT_ :
755
758
var et types.EType = Txxx
756
759
if nl .Type != nil {
757
760
et = nl .Type .Etype
@@ -899,25 +902,27 @@ func evconst(n *Node) {
899
902
Fatalf ("constant type mismatch %v(%d) %v(%d)" , nl .Type , v .Ctype (), nr .Type , rv .Ctype ())
900
903
}
901
904
905
+ // rune values are int values for the purpose of constant folding.
906
+ ctype = uint32 (v .Ctype ())
907
+ if ctype == CTRUNE_ {
908
+ ctype = CTINT_
909
+ }
910
+
902
911
// run op
903
- switch uint32 (n .Op )<< 16 | uint32 ( v . Ctype ()) {
912
+ switch uint32 (n .Op )<< 16 | ctype {
904
913
default :
905
914
goto illegal
906
915
907
- case OADD_ | CTINT_ ,
908
- OADD_ | CTRUNE_ :
916
+ case OADD_ | CTINT_ :
909
917
v .U .(* Mpint ).Add (rv .U .(* Mpint ))
910
918
911
- case OSUB_ | CTINT_ ,
912
- OSUB_ | CTRUNE_ :
919
+ case OSUB_ | CTINT_ :
913
920
v .U .(* Mpint ).Sub (rv .U .(* Mpint ))
914
921
915
- case OMUL_ | CTINT_ ,
916
- OMUL_ | CTRUNE_ :
922
+ case OMUL_ | CTINT_ :
917
923
v .U .(* Mpint ).Mul (rv .U .(* Mpint ))
918
924
919
- case ODIV_ | CTINT_ ,
920
- ODIV_ | CTRUNE_ :
925
+ case ODIV_ | CTINT_ :
921
926
if rv .U .(* Mpint ).CmpInt64 (0 ) == 0 {
922
927
yyerror ("division by zero" )
923
928
v .U .(* Mpint ).SetOverflow ()
@@ -926,8 +931,7 @@ func evconst(n *Node) {
926
931
927
932
v .U .(* Mpint ).Quo (rv .U .(* Mpint ))
928
933
929
- case OMOD_ | CTINT_ ,
930
- OMOD_ | CTRUNE_ :
934
+ case OMOD_ | CTINT_ :
931
935
if rv .U .(* Mpint ).CmpInt64 (0 ) == 0 {
932
936
yyerror ("division by zero" )
933
937
v .U .(* Mpint ).SetOverflow ()
@@ -936,28 +940,22 @@ func evconst(n *Node) {
936
940
937
941
v .U .(* Mpint ).Rem (rv .U .(* Mpint ))
938
942
939
- case OLSH_ | CTINT_ ,
940
- OLSH_ | CTRUNE_ :
943
+ case OLSH_ | CTINT_ :
941
944
v .U .(* Mpint ).Lsh (rv .U .(* Mpint ))
942
945
943
- case ORSH_ | CTINT_ ,
944
- ORSH_ | CTRUNE_ :
946
+ case ORSH_ | CTINT_ :
945
947
v .U .(* Mpint ).Rsh (rv .U .(* Mpint ))
946
948
947
- case OOR_ | CTINT_ ,
948
- OOR_ | CTRUNE_ :
949
+ case OOR_ | CTINT_ :
949
950
v .U .(* Mpint ).Or (rv .U .(* Mpint ))
950
951
951
- case OAND_ | CTINT_ ,
952
- OAND_ | CTRUNE_ :
952
+ case OAND_ | CTINT_ :
953
953
v .U .(* Mpint ).And (rv .U .(* Mpint ))
954
954
955
- case OANDNOT_ | CTINT_ ,
956
- OANDNOT_ | CTRUNE_ :
955
+ case OANDNOT_ | CTINT_ :
957
956
v .U .(* Mpint ).AndNot (rv .U .(* Mpint ))
958
957
959
- case OXOR_ | CTINT_ ,
960
- OXOR_ | CTRUNE_ :
958
+ case OXOR_ | CTINT_ :
961
959
v .U .(* Mpint ).Xor (rv .U .(* Mpint ))
962
960
963
961
case OADD_ | CTFLT_ :
@@ -1015,43 +1013,37 @@ func evconst(n *Node) {
1015
1013
case ONE_ | CTNIL_ :
1016
1014
goto setfalse
1017
1015
1018
- case OEQ_ | CTINT_ ,
1019
- OEQ_ | CTRUNE_ :
1016
+ case OEQ_ | CTINT_ :
1020
1017
if v .U .(* Mpint ).Cmp (rv .U .(* Mpint )) == 0 {
1021
1018
goto settrue
1022
1019
}
1023
1020
goto setfalse
1024
1021
1025
- case ONE_ | CTINT_ ,
1026
- ONE_ | CTRUNE_ :
1022
+ case ONE_ | CTINT_ :
1027
1023
if v .U .(* Mpint ).Cmp (rv .U .(* Mpint )) != 0 {
1028
1024
goto settrue
1029
1025
}
1030
1026
goto setfalse
1031
1027
1032
- case OLT_ | CTINT_ ,
1033
- OLT_ | CTRUNE_ :
1028
+ case OLT_ | CTINT_ :
1034
1029
if v .U .(* Mpint ).Cmp (rv .U .(* Mpint )) < 0 {
1035
1030
goto settrue
1036
1031
}
1037
1032
goto setfalse
1038
1033
1039
- case OLE_ | CTINT_ ,
1040
- OLE_ | CTRUNE_ :
1034
+ case OLE_ | CTINT_ :
1041
1035
if v .U .(* Mpint ).Cmp (rv .U .(* Mpint )) <= 0 {
1042
1036
goto settrue
1043
1037
}
1044
1038
goto setfalse
1045
1039
1046
- case OGE_ | CTINT_ ,
1047
- OGE_ | CTRUNE_ :
1040
+ case OGE_ | CTINT_ :
1048
1041
if v .U .(* Mpint ).Cmp (rv .U .(* Mpint )) >= 0 {
1049
1042
goto settrue
1050
1043
}
1051
1044
goto setfalse
1052
1045
1053
- case OGT_ | CTINT_ ,
1054
- OGT_ | CTRUNE_ :
1046
+ case OGT_ | CTINT_ :
1055
1047
if v .U .(* Mpint ).Cmp (rv .U .(* Mpint )) > 0 {
1056
1048
goto settrue
1057
1049
}
0 commit comments