| // { dg-do compile } |
| // { dg-options "-O2 -Wuninitialized" } |
| |
| typedef int size_t; |
| typedef struct { |
| } max_align_t; |
| typedef struct tree_node *tree; |
| struct ht_identifier { |
| char str; |
| int len; |
| }; |
| struct cpp_hashnode { |
| ht_identifier ident; |
| }; |
| tree get_identifier_with_length(char *, size_t); |
| struct cpp_reader *parse_in; |
| typedef int edit_distance_t; |
| edit_distance_t get_edit_distance(char *); |
| template < typename > struct edit_distance_traits; |
| edit_distance_t get_edit_distance_cutoff(size_t); |
| template < typename GOAL_TYPE, typename CANDIDATE_TYPE > class best_match { |
| public: |
| typedef CANDIDATE_TYPE candidate_t; |
| typedef edit_distance_traits< candidate_t > candidate_traits; |
| best_match(GOAL_TYPE) |
| : m_goal(), m_goal_len(), m_best_candidate(), m_best_distance() {} |
| void consider(candidate_t candidate) { |
| size_t candidate_len = candidate_traits::get_length(candidate); |
| char candidate_str; |
| edit_distance_t dist = get_edit_distance(&candidate_str); |
| bool is_better = false; |
| if (dist) |
| is_better = true; |
| if (is_better) { |
| m_best_candidate = candidate; |
| m_best_candidate_len = candidate_len; |
| } |
| } |
| void set_best_so_far(CANDIDATE_TYPE) {} |
| candidate_t get_best_meaningful_candidate() { |
| edit_distance_t __trans_tmp_1; |
| if (m_best_candidate) { |
| size_t candidate_len = m_best_candidate_len; |
| __trans_tmp_1 = get_edit_distance_cutoff(candidate_len); // { dg-warning "may be used uninitialized" } |
| } |
| edit_distance_t cutoff = __trans_tmp_1; |
| if (cutoff) |
| ; |
| return m_best_candidate; |
| } |
| char m_goal; |
| size_t m_goal_len; |
| candidate_t m_best_candidate; |
| edit_distance_t m_best_distance; |
| size_t m_best_candidate_len; |
| }; |
| template <> struct edit_distance_traits< tree > { |
| static size_t get_length(tree); |
| }; |
| class name_hint {}; |
| class best_macro_match : public best_match< tree, cpp_hashnode * > { |
| public: |
| best_macro_match(cpp_reader *); |
| }; |
| struct c_binding { |
| tree id; |
| c_binding *prev; |
| }; |
| struct c_scope { |
| c_scope *outer; |
| c_binding bindings; |
| } * current_scope; |
| tree lookup_name_fuzzy_name; |
| void lookup_name_fuzzy() { |
| bool consider_implementation_names = 0; |
| best_match< tree, tree > bm(lookup_name_fuzzy_name); |
| for (c_scope *scope = current_scope; current_scope; |
| scope = scope->outer) |
| for (c_binding *binding = &scope->bindings; binding; |
| binding = binding->prev) |
| if (!consider_implementation_names) |
| bm.consider(binding->id); |
| best_macro_match bmm(parse_in); |
| cpp_hashnode *best_macro = bmm.get_best_meaningful_candidate(); |
| if (best_macro) { |
| char id = best_macro->ident.str; |
| tree macro_as_identifier = |
| get_identifier_with_length(&id, best_macro->ident.len); |
| bm.set_best_so_far(macro_as_identifier); |
| } |
| tree best = bm.get_best_meaningful_candidate(); |
| if (best) |
| name_hint(); |
| } |