@@ -242,6 +242,14 @@ class BaseRules : public TyVisitor
242
242
type.as_string ().c_str ());
243
243
}
244
244
245
+ virtual void visit (NeverType &type) override
246
+ {
247
+ Location ref_locus = mappings->lookup_location (type.get_ref ());
248
+ rust_error_at (ref_locus, " expected [%s] got [%s]" ,
249
+ get_base ()->as_string ().c_str (),
250
+ type.as_string ().c_str ());
251
+ }
252
+
245
253
protected:
246
254
BaseRules (BaseType *base)
247
255
: mappings (Analysis::Mappings::get ()),
@@ -478,6 +486,8 @@ class InferRules : public BaseRules
478
486
BaseRules::visit (type);
479
487
}
480
488
489
+ void visit (NeverType &type) override { resolved = base->clone (); }
490
+
481
491
private:
482
492
BaseType *get_base () override { return base; }
483
493
@@ -536,6 +546,8 @@ class FnRules : public BaseRules
536
546
resolved->set_ref (type.get_ref ());
537
547
}
538
548
549
+ void visit (NeverType &type) override { resolved = base->clone (); }
550
+
539
551
private:
540
552
BaseType *get_base () override { return base; }
541
553
@@ -631,6 +643,8 @@ class FnptrRules : public BaseRules
631
643
resolved->set_ref (type.get_ref ());
632
644
}
633
645
646
+ void visit (NeverType &type) override { resolved = base->clone (); }
647
+
634
648
private:
635
649
BaseType *get_base () override { return base; }
636
650
@@ -669,6 +683,8 @@ class ArrayRules : public BaseRules
669
683
type.get_capacity (), TyVar (base_resolved->get_ref ()));
670
684
}
671
685
686
+ void visit (NeverType &type) override { resolved = base->clone (); }
687
+
672
688
private:
673
689
BaseType *get_base () override { return base; }
674
690
@@ -701,6 +717,8 @@ class BoolRules : public BaseRules
701
717
}
702
718
}
703
719
720
+ void visit (NeverType &type) override { resolved = base->clone (); }
721
+
704
722
private:
705
723
BaseType *get_base () override { return base; }
706
724
@@ -739,6 +757,8 @@ class IntRules : public BaseRules
739
757
= new IntType (type.get_ref (), type.get_ty_ref (), type.get_int_kind ());
740
758
}
741
759
760
+ void visit (NeverType &type) override { resolved = base->clone (); }
761
+
742
762
private:
743
763
BaseType *get_base () override { return base; }
744
764
@@ -777,6 +797,8 @@ class UintRules : public BaseRules
777
797
type.get_uint_kind ());
778
798
}
779
799
800
+ void visit (NeverType &type) override { resolved = base->clone (); }
801
+
780
802
private:
781
803
BaseType *get_base () override { return base; }
782
804
@@ -814,6 +836,8 @@ class FloatRules : public BaseRules
814
836
type.get_float_kind ());
815
837
}
816
838
839
+ void visit (NeverType &type) override { resolved = base->clone (); }
840
+
817
841
private:
818
842
BaseType *get_base () override { return base; }
819
843
@@ -854,6 +878,8 @@ class ADTRules : public BaseRules
854
878
resolved = type.clone ();
855
879
}
856
880
881
+ void visit (NeverType &type) override { resolved = base->clone (); }
882
+
857
883
private:
858
884
BaseType *get_base () override { return base; }
859
885
@@ -895,6 +921,8 @@ class TupleRules : public BaseRules
895
921
= new TyTy::TupleType (type.get_ref (), type.get_ty_ref (), fields);
896
922
}
897
923
924
+ void visit (NeverType &type) override { resolved = base->clone (); }
925
+
898
926
private:
899
927
BaseType *get_base () override { return base; }
900
928
@@ -923,6 +951,8 @@ class USizeRules : public BaseRules
923
951
924
952
void visit (USizeType &type) override { resolved = type.clone (); }
925
953
954
+ void visit (NeverType &type) override { resolved = base->clone (); }
955
+
926
956
private:
927
957
BaseType *get_base () override { return base; }
928
958
@@ -951,6 +981,8 @@ class ISizeRules : public BaseRules
951
981
952
982
void visit (ISizeType &type) override { resolved = type.clone (); }
953
983
984
+ void visit (NeverType &type) override { resolved = base->clone (); }
985
+
954
986
private:
955
987
BaseType *get_base () override { return base; }
956
988
@@ -978,6 +1010,8 @@ class CharRules : public BaseRules
978
1010
979
1011
void visit (CharType &type) override { resolved = type.clone (); }
980
1012
1013
+ void visit (NeverType &type) override { resolved = base->clone (); }
1014
+
981
1015
private:
982
1016
BaseType *get_base () override { return base; }
983
1017
@@ -1008,6 +1042,8 @@ class ReferenceRules : public BaseRules
1008
1042
TyVar (base_resolved->get_ref ()));
1009
1043
}
1010
1044
1045
+ void visit (NeverType &type) override { resolved = base->clone (); }
1046
+
1011
1047
private:
1012
1048
BaseType *get_base () override { return base; }
1013
1049
@@ -1053,6 +1089,8 @@ class ParamRules : public BaseRules
1053
1089
resolved = type.clone ();
1054
1090
}
1055
1091
1092
+ void visit (NeverType &type) override { resolved = base->clone (); }
1093
+
1056
1094
private:
1057
1095
BaseType *get_base () override { return base; }
1058
1096
@@ -1069,12 +1107,66 @@ class StrRules : public BaseRules
1069
1107
1070
1108
void visit (StrType &type) override { resolved = type.clone (); }
1071
1109
1110
+ void visit (NeverType &type) override { resolved = base->clone (); }
1111
+
1072
1112
private:
1073
1113
BaseType *get_base () override { return base; }
1074
1114
1075
1115
StrType *base;
1076
1116
};
1077
1117
1118
+ class NeverRules : public BaseRules
1119
+ {
1120
+ using Rust::TyTy::BaseRules::visit;
1121
+
1122
+ public:
1123
+ NeverRules (NeverType *base) : BaseRules (base), base (base) {}
1124
+
1125
+ virtual void visit (TupleType &type) override { resolved = type.clone (); }
1126
+
1127
+ virtual void visit (ADTType &type) override { resolved = type.clone (); }
1128
+
1129
+ virtual void visit (InferType &type) override { resolved = type.clone (); }
1130
+
1131
+ virtual void visit (FnType &type) override { resolved = type.clone (); }
1132
+
1133
+ virtual void visit (FnPtr &type) override { resolved = type.clone (); }
1134
+
1135
+ virtual void visit (ArrayType &type) override { resolved = type.clone (); }
1136
+
1137
+ virtual void visit (BoolType &type) override { resolved = type.clone (); }
1138
+
1139
+ virtual void visit (IntType &type) override { resolved = type.clone (); }
1140
+
1141
+ virtual void visit (UintType &type) override { resolved = type.clone (); }
1142
+
1143
+ virtual void visit (USizeType &type) override { resolved = type.clone (); }
1144
+
1145
+ virtual void visit (ISizeType &type) override { resolved = type.clone (); }
1146
+
1147
+ virtual void visit (FloatType &type) override { resolved = type.clone (); }
1148
+
1149
+ virtual void visit (ErrorType &type) override { resolved = type.clone (); }
1150
+
1151
+ virtual void visit (CharType &type) override { resolved = type.clone (); }
1152
+
1153
+ virtual void visit (ReferenceType &type) override
1154
+ {
1155
+ resolved = type.clone ();
1156
+ }
1157
+
1158
+ virtual void visit (ParamType &type) override { resolved = type.clone (); }
1159
+
1160
+ virtual void visit (StrType &type) override { resolved = type.clone (); }
1161
+
1162
+ virtual void visit (NeverType &type) override { resolved = type.clone (); }
1163
+
1164
+ private:
1165
+ BaseType *get_base () override { return base; }
1166
+
1167
+ NeverType *base;
1168
+ };
1169
+
1078
1170
} // namespace TyTy
1079
1171
} // namespace Rust
1080
1172
0 commit comments