22
22
#include < util/range.h>
23
23
24
24
#include " smt_array_theory.h"
25
+ #include " smt_to_smt2_string.h"
25
26
26
27
#include < regex>
27
28
28
29
static response_or_errort<smt_termt> validate_term (
29
30
const irept &parse_tree,
30
31
const std::unordered_map<irep_idt, smt_identifier_termt> &identifier_table);
31
32
32
- // Implementation detail of `collect_messages ` below.
33
+ // Implementation detail of `collect_error_messages ` below.
33
34
template <typename argumentt, typename ... argumentst>
34
- void collect_messages_impl (
35
- std::vector<std::string> &collected_messages ,
35
+ void collect_error_messages_impl (
36
+ std::vector<std::string> &collected_error_messages ,
36
37
argumentt &&argument)
37
38
{
38
39
if (const auto messages = argument.get_if_error ())
39
40
{
40
- collected_messages .insert (
41
- collected_messages .end (), messages->cbegin (), messages->end ());
41
+ collected_error_messages .insert (
42
+ collected_error_messages .end (), messages->cbegin (), messages->end ());
42
43
}
43
44
}
44
45
45
- // Implementation detail of `collect_messages ` below.
46
+ // Implementation detail of `collect_error_messages ` below.
46
47
template <typename argumentt, typename ... argumentst>
47
- void collect_messages_impl (
48
- std::vector<std::string> &collected_messages ,
48
+ void collect_error_messages_impl (
49
+ std::vector<std::string> &collected_error_messages ,
49
50
argumentt &&argument,
50
51
argumentst &&... arguments)
51
52
{
52
- collect_messages_impl (collected_messages , argument);
53
- collect_messages_impl (collected_messages , arguments...);
53
+ collect_error_messages_impl (collected_error_messages , argument);
54
+ collect_error_messages_impl (collected_error_messages , arguments...);
54
55
}
55
56
56
- // / Builds a collection of messages composed all messages in the
57
+ // / Builds a collection of error messages composed all error messages in the
57
58
// / `response_or_errort` typed arguments in \p arguments. This is a templated
58
59
// / function in order to handle `response_or_errort` instances which are
59
60
// / specialised differently.
60
61
template <typename ... argumentst>
61
- std::vector<std::string> collect_messages (argumentst &&... arguments)
62
+ std::vector<std::string> collect_error_messages (argumentst &&... arguments)
62
63
{
63
- std::vector<std::string> collected_messages ;
64
- collect_messages_impl (collected_messages , arguments...);
65
- return collected_messages ;
64
+ std::vector<std::string> collected_error_messages ;
65
+ collect_error_messages_impl (collected_error_messages , arguments...);
66
+ return collected_error_messages ;
66
67
}
67
68
68
69
// / \brief Given a class to construct and a set of arguments to its constructor
@@ -85,9 +86,9 @@ template <
85
86
typename ... argumentst>
86
87
response_or_errort<smt_baset> validation_propagating (argumentst &&... arguments)
87
88
{
88
- const auto collected_messages = collect_messages (arguments...);
89
- if (!collected_messages .empty ())
90
- return response_or_errort<smt_baset>(collected_messages );
89
+ const auto collected_error_messages = collect_error_messages (arguments...);
90
+ if (!collected_error_messages .empty ())
91
+ return response_or_errort<smt_baset>(collected_error_messages );
91
92
else
92
93
{
93
94
return response_or_errort<smt_baset>{
@@ -255,9 +256,9 @@ static optionalt<response_or_errort<smt_termt>> try_select_validation(
255
256
}
256
257
const auto array = validate_term (parse_tree.get_sub ()[1 ], identifier_table);
257
258
const auto index = validate_term (parse_tree.get_sub ()[2 ], identifier_table);
258
- const auto messages = collect_messages (array, index );
259
- if (!messages .empty ())
260
- return response_or_errort<smt_termt>{messages };
259
+ const auto error_messages = collect_error_messages (array, index );
260
+ if (!error_messages .empty ())
261
+ return response_or_errort<smt_termt>{error_messages };
261
262
return {smt_array_theoryt::select .validation (
262
263
*array.get_if_valid (), *index .get_if_valid ())};
263
264
}
@@ -288,12 +289,27 @@ validate_valuation_pair(
288
289
const irept &pair_parse_tree,
289
290
const std::unordered_map<irep_idt, smt_identifier_termt> &identifier_table)
290
291
{
292
+ using resultt = response_or_errort<smt_get_value_responset::valuation_pairt>;
291
293
PRECONDITION (pair_parse_tree.get_sub ().size () == 2 );
292
- const auto &descriptor = pair_parse_tree.get_sub ()[0 ];
293
- const auto &value = pair_parse_tree.get_sub ()[1 ];
294
- return validation_propagating<smt_get_value_responset::valuation_pairt>(
295
- validate_term (descriptor, identifier_table),
296
- validate_term (value, identifier_table));
294
+ const auto descriptor_validation =
295
+ validate_term (pair_parse_tree.get_sub ()[0 ], identifier_table);
296
+ const auto value_validation =
297
+ validate_term (pair_parse_tree.get_sub ()[1 ], identifier_table);
298
+ const auto error_messages =
299
+ collect_error_messages (descriptor_validation, value_validation);
300
+ if (!error_messages.empty ())
301
+ return resultt{error_messages};
302
+ const auto &valid_descriptor = *descriptor_validation.get_if_valid ();
303
+ const auto &valid_value = *value_validation.get_if_valid ();
304
+ if (valid_descriptor.get_sort () != valid_value.get_sort ())
305
+ {
306
+ return resultt{
307
+ " Mismatched descriptor and value sorts in - " +
308
+ print_parse_tree (pair_parse_tree) + " \n Descriptor has sort " +
309
+ smt_to_smt2_string (valid_descriptor.get_sort ()) + " \n Value has sort " +
310
+ smt_to_smt2_string (valid_value.get_sort ())};
311
+ }
312
+ return resultt{{valid_descriptor, valid_value}};
297
313
}
298
314
299
315
// / \returns: A response or error in the case where the parse tree appears to be
0 commit comments