// { 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(); }