111 add_datatype_to_candidate_list(symbol, datatype1); |
110 add_datatype_to_candidate_list(symbol, datatype1); |
112 add_datatype_to_candidate_list(symbol, datatype2); |
111 add_datatype_to_candidate_list(symbol, datatype2); |
113 return true; |
112 return true; |
114 } |
113 } |
115 |
114 |
|
115 |
|
116 |
116 void fill_candidate_datatypes_c::remove_incompatible_datatypes(symbol_c *symbol) { |
117 void fill_candidate_datatypes_c::remove_incompatible_datatypes(symbol_c *symbol) { |
117 /* Remove unsigned data types */ |
118 #ifdef __REMOVE__ |
118 if (! IS_UNDEF( uint64, symbol)) { |
119 #error __REMOVE__ macro already exists. Choose another name! |
119 if (VALID_CVALUE( uint64, symbol)) { |
120 #endif |
120 uint64_t value = GET_CVALUE(uint64, symbol); |
121 #define __REMOVE__(datatype)\ |
121 if (value > 1) { |
122 remove_from_candidate_datatype_list(&search_constant_type_c::datatype, symbol->candidate_datatypes);\ |
122 remove_from_candidate_datatype_list(&search_constant_type_c::bool_type_name, symbol->candidate_datatypes); |
123 remove_from_candidate_datatype_list(&search_constant_type_c::safe##datatype, symbol->candidate_datatypes); |
123 remove_from_candidate_datatype_list(&search_constant_type_c::safebool_type_name, symbol->candidate_datatypes); |
124 |
124 } |
125 {/* Remove unsigned data types */ |
125 if (value > UINT8_MAX ) { |
126 uint64_t value = 0; |
126 remove_from_candidate_datatype_list(&search_constant_type_c::usint_type_name, symbol->candidate_datatypes); |
127 if (VALID_CVALUE( uint64, symbol)) value = GET_CVALUE(uint64, symbol); |
127 remove_from_candidate_datatype_list(&search_constant_type_c::safeusint_type_name, symbol->candidate_datatypes); |
128 if (IS_OVERFLOW ( uint64, symbol)) value = (uint64_t)UINT32_MAX + (uint64_t)1; |
128 remove_from_candidate_datatype_list(&search_constant_type_c::byte_type_name, symbol->candidate_datatypes); |
129 |
129 remove_from_candidate_datatype_list(&search_constant_type_c::safebyte_type_name, symbol->candidate_datatypes); |
130 if (value > 1 ) {__REMOVE__(bool_type_name);} |
130 } |
131 if (value > UINT8_MAX ) {__REMOVE__(usint_type_name); __REMOVE__( byte_type_name);} |
131 if (value > UINT16_MAX ) { |
132 if (value > UINT16_MAX ) {__REMOVE__( uint_type_name); __REMOVE__( word_type_name);} |
132 remove_from_candidate_datatype_list(&search_constant_type_c::uint_type_name, symbol->candidate_datatypes); |
133 if (value > UINT32_MAX ) {__REMOVE__(udint_type_name); __REMOVE__(dword_type_name);} |
133 remove_from_candidate_datatype_list(&search_constant_type_c::safeuint_type_name, symbol->candidate_datatypes); |
134 if (IS_OVERFLOW( uint64, symbol)) {__REMOVE__(ulint_type_name); __REMOVE__(lword_type_name);} |
134 remove_from_candidate_datatype_list(&search_constant_type_c::word_type_name, symbol->candidate_datatypes); |
|
135 remove_from_candidate_datatype_list(&search_constant_type_c::safeword_type_name, symbol->candidate_datatypes); |
|
136 } |
|
137 if (value > UINT32_MAX ) { |
|
138 remove_from_candidate_datatype_list(&search_constant_type_c::udint_type_name, symbol->candidate_datatypes); |
|
139 remove_from_candidate_datatype_list(&search_constant_type_c::safeudint_type_name, symbol->candidate_datatypes); |
|
140 remove_from_candidate_datatype_list(&search_constant_type_c::dword_type_name, symbol->candidate_datatypes); |
|
141 remove_from_candidate_datatype_list(&search_constant_type_c::safedword_type_name, symbol->candidate_datatypes); |
|
142 } |
|
143 } |
|
144 if (IS_OVERFLOW( uint64, symbol)) { |
|
145 remove_from_candidate_datatype_list(&search_constant_type_c::bool_type_name, symbol->candidate_datatypes); |
|
146 remove_from_candidate_datatype_list(&search_constant_type_c::safebool_type_name, symbol->candidate_datatypes); |
|
147 remove_from_candidate_datatype_list(&search_constant_type_c::usint_type_name, symbol->candidate_datatypes); |
|
148 remove_from_candidate_datatype_list(&search_constant_type_c::safeusint_type_name, symbol->candidate_datatypes); |
|
149 remove_from_candidate_datatype_list(&search_constant_type_c::byte_type_name, symbol->candidate_datatypes); |
|
150 remove_from_candidate_datatype_list(&search_constant_type_c::safebyte_type_name, symbol->candidate_datatypes); |
|
151 remove_from_candidate_datatype_list(&search_constant_type_c::uint_type_name, symbol->candidate_datatypes); |
|
152 remove_from_candidate_datatype_list(&search_constant_type_c::safeuint_type_name, symbol->candidate_datatypes); |
|
153 remove_from_candidate_datatype_list(&search_constant_type_c::word_type_name, symbol->candidate_datatypes); |
|
154 remove_from_candidate_datatype_list(&search_constant_type_c::safeword_type_name, symbol->candidate_datatypes); |
|
155 remove_from_candidate_datatype_list(&search_constant_type_c::udint_type_name, symbol->candidate_datatypes); |
|
156 remove_from_candidate_datatype_list(&search_constant_type_c::safeudint_type_name, symbol->candidate_datatypes); |
|
157 remove_from_candidate_datatype_list(&search_constant_type_c::dword_type_name, symbol->candidate_datatypes); |
|
158 remove_from_candidate_datatype_list(&search_constant_type_c::safedword_type_name, symbol->candidate_datatypes); |
|
159 remove_from_candidate_datatype_list(&search_constant_type_c::ulint_type_name, symbol->candidate_datatypes); |
|
160 remove_from_candidate_datatype_list(&search_constant_type_c::safeulint_type_name, symbol->candidate_datatypes); |
|
161 remove_from_candidate_datatype_list(&search_constant_type_c::lword_type_name, symbol->candidate_datatypes); |
|
162 remove_from_candidate_datatype_list(&search_constant_type_c::safelword_type_name, symbol->candidate_datatypes); |
|
163 } |
|
164 } |
135 } |
165 /* Remove signed data types */ |
136 |
166 if (! IS_UNDEF( int64, symbol)) { |
137 {/* Remove signed data types */ |
167 if (VALID_CVALUE( int64, symbol)) { |
138 int64_t value = 0; |
168 int64_t value = GET_CVALUE(int64, symbol); |
139 if (VALID_CVALUE( int64, symbol)) value = GET_CVALUE(int64, symbol); |
169 if (value < 0 || value > 1) { |
140 if (IS_OVERFLOW ( int64, symbol)) value = (int64_t)INT32_MAX + (int64_t)1; |
170 remove_from_candidate_datatype_list(&search_constant_type_c::bool_type_name, symbol->candidate_datatypes); |
141 |
171 remove_from_candidate_datatype_list(&search_constant_type_c::safebool_type_name, symbol->candidate_datatypes); |
142 if ((value < 0) || (value > 1)) {__REMOVE__( bool_type_name);} |
172 } |
143 if ((value < INT8_MIN) || (value > INT8_MAX)) {__REMOVE__(sint_type_name); __REMOVE__( byte_type_name);} |
173 if ((value < INT8_MIN ) || (value > INT8_MAX )) { |
144 if ((value < INT16_MIN) || (value > INT16_MAX)) {__REMOVE__( int_type_name); __REMOVE__( word_type_name);} |
174 remove_from_candidate_datatype_list(&search_constant_type_c::sint_type_name, symbol->candidate_datatypes); |
145 if ((value < INT32_MIN) || (value > INT32_MAX)) {__REMOVE__(dint_type_name); __REMOVE__(dword_type_name);} |
175 remove_from_candidate_datatype_list(&search_constant_type_c::safesint_type_name, symbol->candidate_datatypes); |
146 if (IS_OVERFLOW( int64, symbol)) {__REMOVE__(lint_type_name); __REMOVE__(lword_type_name);} |
176 remove_from_candidate_datatype_list(&search_constant_type_c::byte_type_name, symbol->candidate_datatypes); |
|
177 remove_from_candidate_datatype_list(&search_constant_type_c::safebyte_type_name, symbol->candidate_datatypes); |
|
178 } |
|
179 if ((value < INT16_MIN ) || (value > INT16_MAX)) { |
|
180 remove_from_candidate_datatype_list(&search_constant_type_c::int_type_name, symbol->candidate_datatypes); |
|
181 remove_from_candidate_datatype_list(&search_constant_type_c::safeint_type_name, symbol->candidate_datatypes); |
|
182 remove_from_candidate_datatype_list(&search_constant_type_c::word_type_name, symbol->candidate_datatypes); |
|
183 remove_from_candidate_datatype_list(&search_constant_type_c::safeword_type_name, symbol->candidate_datatypes); |
|
184 } |
|
185 if ((value < INT32_MIN ) || (value > INT32_MAX)) { |
|
186 remove_from_candidate_datatype_list(&search_constant_type_c::dint_type_name, symbol->candidate_datatypes); |
|
187 remove_from_candidate_datatype_list(&search_constant_type_c::safedint_type_name, symbol->candidate_datatypes); |
|
188 remove_from_candidate_datatype_list(&search_constant_type_c::dword_type_name, symbol->candidate_datatypes); |
|
189 remove_from_candidate_datatype_list(&search_constant_type_c::safedword_type_name, symbol->candidate_datatypes); |
|
190 } |
|
191 } |
|
192 if (IS_OVERFLOW( int64, symbol)) { |
|
193 /* Not exist a valid signed integer data types it can represent the current value */ |
|
194 remove_from_candidate_datatype_list(&search_constant_type_c::sint_type_name, symbol->candidate_datatypes); |
|
195 remove_from_candidate_datatype_list(&search_constant_type_c::safesint_type_name, symbol->candidate_datatypes); |
|
196 remove_from_candidate_datatype_list(&search_constant_type_c::int_type_name, symbol->candidate_datatypes); |
|
197 remove_from_candidate_datatype_list(&search_constant_type_c::safeint_type_name, symbol->candidate_datatypes); |
|
198 remove_from_candidate_datatype_list(&search_constant_type_c::dint_type_name, symbol->candidate_datatypes); |
|
199 remove_from_candidate_datatype_list(&search_constant_type_c::safedint_type_name, symbol->candidate_datatypes); |
|
200 remove_from_candidate_datatype_list(&search_constant_type_c::lint_type_name, symbol->candidate_datatypes); |
|
201 remove_from_candidate_datatype_list(&search_constant_type_c::safelint_type_name, symbol->candidate_datatypes); |
|
202 remove_from_candidate_datatype_list(&search_constant_type_c::byte_type_name, symbol->candidate_datatypes); |
|
203 remove_from_candidate_datatype_list(&search_constant_type_c::safebyte_type_name, symbol->candidate_datatypes); |
|
204 remove_from_candidate_datatype_list(&search_constant_type_c::word_type_name, symbol->candidate_datatypes); |
|
205 remove_from_candidate_datatype_list(&search_constant_type_c::safeword_type_name, symbol->candidate_datatypes); |
|
206 remove_from_candidate_datatype_list(&search_constant_type_c::dword_type_name, symbol->candidate_datatypes); |
|
207 remove_from_candidate_datatype_list(&search_constant_type_c::safedword_type_name, symbol->candidate_datatypes); |
|
208 remove_from_candidate_datatype_list(&search_constant_type_c::lword_type_name, symbol->candidate_datatypes); |
|
209 remove_from_candidate_datatype_list(&search_constant_type_c::safelword_type_name, symbol->candidate_datatypes); |
|
210 } |
|
211 } |
147 } |
212 /* Remove floating point data types */ |
148 |
213 if (! IS_UNDEF( real64, symbol)) { |
149 {/* Remove floating point data types */ |
214 if (VALID_CVALUE( real64, symbol)) { |
150 real64_t value = 0; |
215 real64_t value = GET_CVALUE(real64, symbol); |
151 if (VALID_CVALUE( real64, symbol)) value = GET_CVALUE(real64, symbol); |
216 /* We need a way to understand when lost precision happen and overflow for single precision. |
152 if (value > REAL32_MAX ) {__REMOVE__( real_type_name);} |
217 * In this way we can remove REAL data type when a value has a mantissa or exponent too large. |
153 if (value < -REAL32_MAX ) {__REMOVE__( real_type_name);} |
218 */ |
154 if (IS_OVERFLOW( real64, symbol)) {__REMOVE__(lreal_type_name);} |
219 } |
|
220 if (IS_OVERFLOW( real64, symbol)) { |
|
221 /* Not exist a valid real data types that it can represent the current value */ |
|
222 remove_from_candidate_datatype_list(&search_constant_type_c::real_type_name, symbol->candidate_datatypes); |
|
223 remove_from_candidate_datatype_list(&search_constant_type_c::safereal_type_name, symbol->candidate_datatypes); |
|
224 remove_from_candidate_datatype_list(&search_constant_type_c::lreal_type_name, symbol->candidate_datatypes); |
|
225 remove_from_candidate_datatype_list(&search_constant_type_c::safelreal_type_name, symbol->candidate_datatypes); |
|
226 } |
|
227 } |
155 } |
|
156 #undef __REMOVE__ |
228 } |
157 } |
229 |
158 |
230 |
159 |
231 /* returns true if compatible function/FB invocation, otherwise returns false */ |
160 /* returns true if compatible function/FB invocation, otherwise returns false */ |
232 /* Assumes that the candidate_datatype lists of all the parameters being passed haved already been filled in */ |
161 /* Assumes that the candidate_datatype lists of all the parameters being passed haved already been filled in */ |