From: Jason Merrill Date: Fri, 20 May 2011 18:01:22 +0000 (-0400) Subject: re PR c++/24163 (dependent Base class scope examined during unqualified name lookup... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=94df301fa033641561145d44ed48cf4c85d43a2c;p=gcc.git re PR c++/24163 (dependent Base class scope examined during unqualified name lookup in template) PR c++/24163 PR c++/29131 gcc/cp/ * pt.c (tsubst_copy_and_build) [CALL_EXPR]: Avoid repeating unqualified lookup. * semantics.c (perform_koenig_lookup): Add complain parm. * cp-tree.h: Adjust. * parser.c (cp_parser_postfix_expression): Adjust. (cp_parser_perform_range_for_lookup): Adjust. libstdc++-v3/ * include/ext/pb_ds/assoc_container.hpp: Explicitly qualify calls to functions from dependent bases. * include/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/rb_tree_map_/ split_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/ split_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/tree_policy/ order_statistics_imp.hpp: Likewise. * include/ext/pb_ds/detail/trie_policy/ prefix_search_node_update_imp.hpp: Likewise. * include/ext/rc_string_base.h: Likewise. * include/ext/rope: Likewise. * include/ext/ropeimpl.h: Likewise. * testsuite/util/exception/safety.h: Likewise. * testsuite/util/native_type/native_priority_queue.hpp: Likewise. * testsuite/util/testsuite_io.h: Likewise. * include/std/functional: Declare mem_fn earlier. * include/tr1/functional: Likewise. * include/tr1/exp_integral.tcc: Declare __expint_E1 earlier. From-SVN: r173965 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 61adf5fb9fd..5d93472bba3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2011-05-20 Jason Merrill + + PR c++/24163 + PR c++/29131 + * pt.c (tsubst_copy_and_build) [CALL_EXPR]: Avoid repeating + unqualified lookup. + * semantics.c (perform_koenig_lookup): Add complain parm. + * cp-tree.h: Adjust. + * parser.c (cp_parser_postfix_expression): Adjust. + (cp_parser_perform_range_for_lookup): Adjust. + 2011-05-20 Jason Merrill * semantics.c (finish_call_expr): SET_EXPR_LOCATION. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 3ccbfda2adc..ada01fbd129 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5365,7 +5365,8 @@ extern tree finish_stmt_expr_expr (tree, tree); extern tree finish_stmt_expr (tree, bool); extern tree stmt_expr_value_expr (tree); bool empty_expr_stmt_p (tree); -extern tree perform_koenig_lookup (tree, VEC(tree,gc) *, bool); +extern tree perform_koenig_lookup (tree, VEC(tree,gc) *, bool, + tsubst_flags_t); extern tree finish_call_expr (tree, VEC(tree,gc) **, bool, bool, tsubst_flags_t); extern tree finish_increment_expr (tree, enum tree_code); diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index cf9286a21dd..2b452601e5f 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5019,7 +5019,8 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, if (!any_type_dependent_arguments_p (args)) postfix_expression = perform_koenig_lookup (postfix_expression, args, - /*include_std=*/false); + /*include_std=*/false, + tf_warning_or_error); } else postfix_expression @@ -5044,7 +5045,8 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, if (!any_type_dependent_arguments_p (args)) postfix_expression = perform_koenig_lookup (postfix_expression, args, - /*include_std=*/false); + /*include_std=*/false, + tf_warning_or_error); } } } @@ -8741,11 +8743,13 @@ cp_parser_perform_range_for_lookup (tree range, tree *begin, tree *end) VEC_safe_push (tree, gc, vec, range); member_begin = perform_koenig_lookup (id_begin, vec, - /*include_std=*/true); + /*include_std=*/true, + tf_warning_or_error); *begin = finish_call_expr (member_begin, &vec, false, true, tf_warning_or_error); member_end = perform_koenig_lookup (id_end, vec, - /*include_std=*/true); + /*include_std=*/true, + tf_warning_or_error); *end = finish_call_expr (member_end, &vec, false, true, tf_warning_or_error); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 75d0674bb40..d72596f5525 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -12894,6 +12894,20 @@ tsubst_copy_and_build (tree t, /*done=*/false, /*address_p=*/false); } + else if (koenig_p && TREE_CODE (function) == IDENTIFIER_NODE) + { + /* Do nothing; calling tsubst_copy_and_build on an identifier + would incorrectly perform unqualified lookup again. + + Note that we can also have an IDENTIFIER_NODE if the earlier + unqualified lookup found a member function; in that case + koenig_p will be false and we do want to do the lookup + again to find the instantiated member function. + + FIXME but doing that causes c++/15272, so we need to stop + using IDENTIFIER_NODE in that situation. */ + qualified_p = false; + } else { if (TREE_CODE (function) == COMPONENT_REF) @@ -12965,14 +12979,59 @@ tsubst_copy_and_build (tree t, into a non-dependent call. */ && type_dependent_expression_p_push (t) && !any_type_dependent_arguments_p (call_args)) - function = perform_koenig_lookup (function, call_args, false); + function = perform_koenig_lookup (function, call_args, false, + tf_none); if (TREE_CODE (function) == IDENTIFIER_NODE - && !processing_template_decl) + && !any_type_dependent_arguments_p (call_args)) { - unqualified_name_lookup_error (function); - release_tree_vector (call_args); - return error_mark_node; + if (koenig_p && (complain & tf_warning_or_error)) + { + /* For backwards compatibility and good diagnostics, try + the unqualified lookup again if we aren't in SFINAE + context. */ + tree unq = (tsubst_copy_and_build + (function, args, complain, in_decl, true, + integral_constant_expression_p)); + if (unq != function) + { + tree fn = unq; + if (TREE_CODE (fn) == COMPONENT_REF) + fn = TREE_OPERAND (fn, 1); + if (is_overloaded_fn (fn)) + fn = get_first_fn (fn); + permerror (EXPR_LOC_OR_HERE (t), + "%qD was not declared in this scope, " + "and no declarations were found by " + "argument-dependent lookup at the point " + "of instantiation", function); + if (DECL_CLASS_SCOPE_P (fn)) + { + inform (EXPR_LOC_OR_HERE (t), + "declarations in dependent base %qT are " + "not found by unqualified lookup", + DECL_CLASS_CONTEXT (fn)); + if (current_class_ptr) + inform (EXPR_LOC_OR_HERE (t), + "use %%D%> instead", function); + else + inform (EXPR_LOC_OR_HERE (t), + "use %<%T::%D%> instead", + TYPE_IDENTIFIER (current_class_type), + function); + } + else + inform (0, "%q+D declared here, later in the " + "translation unit", fn); + function = unq; + } + } + if (TREE_CODE (function) == IDENTIFIER_NODE) + { + unqualified_name_lookup_error (function); + release_tree_vector (call_args); + return error_mark_node; + } } /* Remember that there was a reference to this entity. */ diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 02e08e31025..a7ca50d15e2 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1953,7 +1953,8 @@ empty_expr_stmt_p (tree expr_stmt) Returns the functions to be considered by overload resolution. */ tree -perform_koenig_lookup (tree fn, VEC(tree,gc) *args, bool include_std) +perform_koenig_lookup (tree fn, VEC(tree,gc) *args, bool include_std, + tsubst_flags_t complain) { tree identifier = NULL_TREE; tree functions = NULL_TREE; @@ -1991,8 +1992,13 @@ perform_koenig_lookup (tree fn, VEC(tree,gc) *args, bool include_std) { fn = lookup_arg_dependent (identifier, functions, args, include_std); if (!fn) - /* The unqualified name could not be resolved. */ - fn = unqualified_fn_lookup_error (identifier); + { + /* The unqualified name could not be resolved. */ + if (complain) + fn = unqualified_fn_lookup_error (identifier); + else + fn = identifier; + } } if (fn && template_id) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2bdb809c11f..ba56b6d7745 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2011-05-20 Jason Merrill + + * g++.dg/template/koenig9.C: New. + * g++.dg/opt/pr47615.C: Fix. + * g++.dg/overload/defarg1.C: Fix. + * g++.dg/tc1/dr213.C: Remove xfail. + * g++.dg/torture/pr34850.C: Fix. + * g++.dg/torture/pr39362.C: Fix. + * g++.old-deja/g++.brendan/crash56.C: Fix. + * g++.old-deja/g++.pt/memtemp47.C: Fix. + 2011-05-20 Richard Guenther PR tree-optimization/49079 diff --git a/gcc/testsuite/g++.dg/opt/pr47615.C b/gcc/testsuite/g++.dg/opt/pr47615.C index bbbcbe1e47f..f8dbcf7e824 100644 --- a/gcc/testsuite/g++.dg/opt/pr47615.C +++ b/gcc/testsuite/g++.dg/opt/pr47615.C @@ -360,7 +360,7 @@ template < typename Const_Node_Iterator, typename Node_Iterator, typename, typen { { { - rotate_right (p_nd); + this->rotate_right (p_nd); } } } diff --git a/gcc/testsuite/g++.dg/overload/defarg1.C b/gcc/testsuite/g++.dg/overload/defarg1.C index 44de733736f..5d34a457dc2 100644 --- a/gcc/testsuite/g++.dg/overload/defarg1.C +++ b/gcc/testsuite/g++.dg/overload/defarg1.C @@ -3,7 +3,9 @@ template int foo (T t, int = foo(T())); +struct A { }; + int main() { - foo(0); // { dg-error "default argument" } + foo(A()); // { dg-error "default argument" } } diff --git a/gcc/testsuite/g++.dg/tc1/dr213.C b/gcc/testsuite/g++.dg/tc1/dr213.C index 2cc70138acf..b616ff9e11a 100644 --- a/gcc/testsuite/g++.dg/tc1/dr213.C +++ b/gcc/testsuite/g++.dg/tc1/dr213.C @@ -8,7 +8,7 @@ template struct A : T { void h(T t) { f(t); - g(t); // { dg-error "" "" { xfail *-*-* } } + g(t); // { dg-message "" } } }; @@ -21,7 +21,7 @@ void f(B) {} int main() { - A ab; // { dg-error "" "" { xfail *-*-* } } + A ab; B b; - ab.h(b); + ab.h(b); // { dg-message "instantiated" } } diff --git a/gcc/testsuite/g++.dg/template/koenig9.C b/gcc/testsuite/g++.dg/template/koenig9.C new file mode 100644 index 00000000000..ae74a47e50a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig9.C @@ -0,0 +1,33 @@ +// PR c++/29131 +// int has no associated namespaces, so arg-dep lookup doesn't find g(int). + +template int f() { return g(T()); } // { dg-error "argument-dependent" } +int g(int); // { dg-message "declared here" } +int i = f(); + +// PR c++/24163 +// Unqualified lookup doesn't find names from dependent bases. + +template +struct A +{ + static void h(T); +}; + +template struct B: A +{ + void f() { h(T()); } // { dg-error "argument-dependent" } + static void g() { h(T()); } // { dg-error "argument-dependent" } +}; + +int main() +{ + B b; + b.f(); + b.g(); +} + +// { dg-message "dependent base .A.int" "" { target *-*-* } 19 } +// { dg-message "this->h" "" { target *-*-* } 19 } +// { dg-message "dependent base .A.int" "" { target *-*-* } 20 } +// { dg-message "B::h" "" { target *-*-* } 20 } diff --git a/gcc/testsuite/g++.dg/torture/pr34850.C b/gcc/testsuite/g++.dg/torture/pr34850.C index 4f630f8371c..5e30f1dab65 100644 --- a/gcc/testsuite/g++.dg/torture/pr34850.C +++ b/gcc/testsuite/g++.dg/torture/pr34850.C @@ -48,7 +48,7 @@ template void MemoryRegion::create(u32bit n) { template class SecureVector : public MemoryRegion { public: SecureVector& operator=(const MemoryRegion& in) { - if(this != &in) set(in); + if(this != &in) this->set(in); } }; class OctetString { diff --git a/gcc/testsuite/g++.dg/torture/pr39362.C b/gcc/testsuite/g++.dg/torture/pr39362.C index fb23439f595..e7b0774d96f 100644 --- a/gcc/testsuite/g++.dg/torture/pr39362.C +++ b/gcc/testsuite/g++.dg/torture/pr39362.C @@ -55,7 +55,7 @@ template class I; template struct I : H { I (int capacity) { allocateBuffer (capacity); } - ~I () { deallocateBuffer (buffer ()); } + ~I () { this->deallocateBuffer (buffer ()); } using H ::allocateBuffer; H ::buffer; }; diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/crash56.C b/gcc/testsuite/g++.old-deja/g++.brendan/crash56.C index ad652cf9358..a22615dce62 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/crash56.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/crash56.C @@ -253,7 +253,7 @@ void SetLD::add(const T& item) { if ( ! contains(item) ) - append(item); + this->append(item); } template void diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memtemp47.C b/gcc/testsuite/g++.old-deja/g++.pt/memtemp47.C index 7ed5a249278..242a299c164 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/memtemp47.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/memtemp47.C @@ -18,7 +18,7 @@ struct T : public S { template void f(U u) - { printf ("In T::f(U)\n"); g(u); } + { printf ("In T::f(U)\n"); this->g(u); } }; int main() diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f6b9159d235..68edbdba5c4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,29 @@ +2011-05-20 Jason Merrill + + * include/ext/pb_ds/assoc_container.hpp: Explicitly qualify calls to + functions from dependent bases. + * include/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp: Likewise. + * include/ext/pb_ds/detail/rb_tree_map_/ + split_join_fn_imps.hpp: Likewise. + * include/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp: Likewise. + * include/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp: Likewise. + * include/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp: Likewise. + * include/ext/pb_ds/detail/splay_tree_/ + split_join_fn_imps.hpp: Likewise. + * include/ext/pb_ds/detail/tree_policy/ + order_statistics_imp.hpp: Likewise. + * include/ext/pb_ds/detail/trie_policy/ + prefix_search_node_update_imp.hpp: Likewise. + * include/ext/rc_string_base.h: Likewise. + * include/ext/rope: Likewise. + * include/ext/ropeimpl.h: Likewise. + * testsuite/util/exception/safety.h: Likewise. + * testsuite/util/native_type/native_priority_queue.hpp: Likewise. + * testsuite/util/testsuite_io.h: Likewise. + * include/std/functional: Declare mem_fn earlier. + * include/tr1/functional: Likewise. + * include/tr1/exp_integral.tcc: Declare __expint_E1 earlier. + 2011-05-19 Paolo Carlini * include/std/tuple (tuple_element<__i, const _Tp>, diff --git a/libstdc++-v3/include/ext/pb_ds/assoc_container.hpp b/libstdc++-v3/include/ext/pb_ds/assoc_container.hpp index 9cec3b72c54..12a3fc501c9 100644 --- a/libstdc++-v3/include/ext/pb_ds/assoc_container.hpp +++ b/libstdc++-v3/include/ext/pb_ds/assoc_container.hpp @@ -234,7 +234,7 @@ namespace __gnu_pbds template cc_hash_table(It first, It last, const hash_fn& h) : base_type(h) - { copy_from_range(first, last); } + { this->copy_from_range(first, last); } // Constructor taking __iterators to a range of value_types and // some policy objects The value_types between first_it and @@ -245,7 +245,7 @@ namespace __gnu_pbds template cc_hash_table(It first, It last, const hash_fn& h, const eq_fn& e) : base_type(h, e) - { copy_from_range(first, last); } + { this->copy_from_range(first, last); } // Constructor taking __iterators to a range of value_types and // some policy objects The value_types between first_it and @@ -258,7 +258,7 @@ namespace __gnu_pbds cc_hash_table(It first, It last, const hash_fn& h, const eq_fn& e, const comb_hash_fn& ch) : base_type(h, e, ch) - { copy_from_range(first, last); } + { this->copy_from_range(first, last); } // Constructor taking __iterators to a range of value_types and // some policy objects The value_types between first_it and @@ -272,7 +272,7 @@ namespace __gnu_pbds cc_hash_table(It first, It last, const hash_fn& h, const eq_fn& e, const comb_hash_fn& ch, const resize_policy& rp) : base_type(h, e, ch, rp) - { copy_from_range(first, last); } + { this->copy_from_range(first, last); } cc_hash_table(const cc_hash_table& other) : base_type((const base_type&)other) diff --git a/libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp b/libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp index 5a335a6dd47..0ef925f079e 100644 --- a/libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp +++ b/libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp @@ -43,7 +43,7 @@ inline bool PB_DS_CLASS_C_DEC:: erase(const_key_reference r_key) { - point_iterator it = find(r_key); + point_iterator it = this->find(r_key); if (it == base_type::end()) return false; erase(it); @@ -121,7 +121,7 @@ void PB_DS_CLASS_C_DEC:: remove_node(node_pointer p_z) { - update_min_max_for_erased_node(p_z); + this->update_min_max_for_erased_node(p_z); node_pointer p_y = p_z; node_pointer p_x = 0; node_pointer p_new_x_parent = 0; @@ -185,7 +185,7 @@ remove_node(node_pointer p_z) p_y = p_z; } - update_to_top(p_new_x_parent, (node_update* )this); + this->update_to_top(p_new_x_parent, (node_update* )this); if (p_y->m_red) return; @@ -238,7 +238,7 @@ remove_fixup(node_pointer p_x, node_pointer p_new_x_parent) p_w->m_p_right->m_red = false; base_type::rotate_left(p_new_x_parent); - update_to_top(p_new_x_parent, (node_update* )this); + this->update_to_top(p_new_x_parent, (node_update* )this); break; } } @@ -279,7 +279,7 @@ remove_fixup(node_pointer p_x, node_pointer p_new_x_parent) p_w->m_p_left->m_red = false; base_type::rotate_right(p_new_x_parent); - update_to_top(p_new_x_parent, (node_update* )this); + this->update_to_top(p_new_x_parent, (node_update* )this); break; } } diff --git a/libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp b/libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp index a0d079b142f..198caca8868 100644 --- a/libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp +++ b/libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp @@ -246,7 +246,7 @@ split(const_key_reference r_key, PB_DS_CLASS_C_DEC& other) PB_DS_STRUCT_ONLY_ASSERT_VALID((*this)) PB_DS_STRUCT_ONLY_ASSERT_VALID(other) - node_pointer p_nd = upper_bound(r_key).m_p_nd; + node_pointer p_nd = this->upper_bound(r_key).m_p_nd; do { node_pointer p_next_nd = p_nd->m_p_parent; @@ -292,7 +292,7 @@ split_at_node(node_pointer p_nd, PB_DS_CLASS_C_DEC& other) if (p_l != 0) p_l->m_p_parent = p_parent; - update_to_top(p_parent, (node_update* )this); + this->update_to_top(p_parent, (node_update* )this); if (!p_nd->m_red) remove_fixup(p_l, p_parent); diff --git a/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp b/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp index 207577cf492..22f8e68c440 100644 --- a/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp +++ b/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp @@ -142,7 +142,7 @@ erase_node(node_pointer p_nd) if (p_l != 0) p_l->m_p_parent = p_target_r; PB_DS_ASSERT_VALID((*this)) - apply_update(p_target_r, (node_update* )this); + this->apply_update(p_target_r, (node_update* )this); } PB_DS_CLASS_T_DEC diff --git a/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp b/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp index 97441c9df46..4e1179ead2f 100644 --- a/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp +++ b/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp @@ -90,5 +90,5 @@ insert_leaf_imp(const_reference r_value) while (p_nd->m_p_right != 0) p_nd = p_nd->m_p_right; - return std::make_pair(insert_leaf_new(r_value, p_nd, false), true); + return std::make_pair(this->insert_leaf_new(r_value, p_nd, false), true); } diff --git a/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp b/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp index ec38cf81314..b1523662c43 100644 --- a/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp +++ b/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp @@ -274,9 +274,9 @@ splay_zz_end(node_pointer p_nd, node_pointer p_parent, if (p_nd->m_p_parent == base_type::m_p_head) base_type::m_p_head->m_p_parent = p_nd; - apply_update(p_grandparent, (node_update* )this); - apply_update(p_parent, (node_update* )this); - apply_update(p_nd, (node_update* )this); + this->apply_update(p_grandparent, (node_update* )this); + this->apply_update(p_parent, (node_update* )this); + this->apply_update(p_nd, (node_update* )this); PB_DS_ASSERT_BASE_NODE_CONSISTENT(p_nd) } diff --git a/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/split_join_fn_imps.hpp b/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/split_join_fn_imps.hpp index cb04d656933..fe4cfa57bf7 100644 --- a/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/split_join_fn_imps.hpp +++ b/libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/split_join_fn_imps.hpp @@ -66,7 +66,7 @@ join(PB_DS_CLASS_C_DEC& other) base_type::m_p_head->m_p_parent = p_target_r; p_target_r->m_p_parent = base_type::m_p_head; - apply_update(p_target_r, (node_update* )this); + this->apply_update(p_target_r, (node_update* )this); base_type::join_finish(other); @@ -89,7 +89,7 @@ split(const_key_reference r_key, PB_DS_CLASS_C_DEC& other) return; } - node_pointer p_upper_bound = upper_bound(r_key).m_p_nd; + node_pointer p_upper_bound = this->upper_bound(r_key).m_p_nd; _GLIBCXX_DEBUG_ASSERT(p_upper_bound != 0); splay(p_upper_bound); @@ -103,7 +103,7 @@ split(const_key_reference r_key, PB_DS_CLASS_C_DEC& other) other.m_p_head->m_p_parent = p_upper_bound; p_upper_bound->m_p_parent = other.m_p_head; p_upper_bound->m_p_left = 0; - apply_update(p_upper_bound, (node_update* )this); + this->apply_update(p_upper_bound, (node_update* )this); base_type::split_finish(other); PB_DS_ASSERT_VALID((*this)) diff --git a/libstdc++-v3/include/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp b/libstdc++-v3/include/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp index 1d33767a2c0..d3b27925f7e 100644 --- a/libstdc++-v3/include/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp +++ b/libstdc++-v3/include/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp @@ -96,9 +96,9 @@ order_of_key(const_key_reference r_key) const { const_node_iterator l_it = it.get_l_child(); - if (r_cmp_fn(r_key, extract_key(*(*it)))) + if (r_cmp_fn(r_key, this->extract_key(*(*it)))) it = l_it; - else if (r_cmp_fn(extract_key(*(*it)), r_key)) + else if (r_cmp_fn(this->extract_key(*(*it)), r_key)) { ord += (l_it == end_it)? diff --git a/libstdc++-v3/include/ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp b/libstdc++-v3/include/ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp index cdd8989295c..ff2799e3e95 100644 --- a/libstdc++-v3/include/ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp +++ b/libstdc++-v3/include/ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp @@ -104,9 +104,9 @@ prefix_range(typename e_access_traits::const_iterator b, typename e_access_trait if (common_range_length >= given_range_length) { - iterator ret_b = leftmost_it(nd_it); + iterator ret_b = this->leftmost_it(nd_it); - iterator ret_e = rightmost_it(nd_it); + iterator ret_e = this->rightmost_it(nd_it); return (std::make_pair(ret_b, ++ret_e)); } diff --git a/libstdc++-v3/include/ext/rc_string_base.h b/libstdc++-v3/include/ext/rc_string_base.h index 4a27ff6ef5b..afd4d9e3688 100644 --- a/libstdc++-v3/include/ext/rc_string_base.h +++ b/libstdc++-v3/include/ext/rc_string_base.h @@ -461,7 +461,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __alloc); if (_M_info._M_length) - _S_copy(__r->_M_refdata(), _M_refdata(), _M_info._M_length); + __rc_string_base::_S_copy(__r->_M_refdata(), _M_refdata(), _M_info._M_length); __r->_M_set_length(_M_info._M_length); return __r->_M_refdata(); @@ -569,7 +569,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Check for out_of_range and length_error exceptions. _Rep* __r = _Rep::_S_create(__dnew, size_type(0), __a); __try - { _S_copy_chars(__r->_M_refdata(), __beg, __end); } + { __rc_string_base::_S_copy_chars(__r->_M_refdata(), __beg, __end); } __catch(...) { __r->_M_destroy(__a); @@ -590,7 +590,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Check for out_of_range and length_error exceptions. _Rep* __r = _Rep::_S_create(__n, size_type(0), __a); if (__n) - _S_assign(__r->_M_refdata(), __n, __c); + __rc_string_base::_S_assign(__r->_M_refdata(), __n, __c); __r->_M_set_length(__n); return __r->_M_refdata(); @@ -659,11 +659,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_capacity(), _M_get_allocator()); if (__pos) - _S_copy(__r->_M_refdata(), _M_data(), __pos); + this->_S_copy(__r->_M_refdata(), _M_data(), __pos); if (__s && __len2) - _S_copy(__r->_M_refdata() + __pos, __s, __len2); + this->_S_copy(__r->_M_refdata() + __pos, __s, __len2); if (__how_much) - _S_copy(__r->_M_refdata() + __pos + __len2, + this->_S_copy(__r->_M_refdata() + __pos + __len2, _M_data() + __pos + __len1, __how_much); _M_dispose(); @@ -685,9 +685,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_get_allocator()); if (__pos) - _S_copy(__r->_M_refdata(), _M_data(), __pos); + this->_S_copy(__r->_M_refdata(), _M_data(), __pos); if (__how_much) - _S_copy(__r->_M_refdata() + __pos, + this->_S_copy(__r->_M_refdata() + __pos, _M_data() + __pos + __n, __how_much); _M_dispose(); @@ -696,7 +696,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION else if (__how_much && __n) { // Work in-place. - _S_move(_M_data() + __pos, + this->_S_move(_M_data() + __pos, _M_data() + __pos + __n, __how_much); } diff --git a/libstdc++-v3/include/ext/rope b/libstdc++-v3/include/ext/rope index 42921516e40..5e82811757c 100644 --- a/libstdc++-v3/include/ext/rope +++ b/libstdc++-v3/include/ext/rope @@ -729,7 +729,7 @@ protected: if (_M_data != this->_M_c_string) this->_M_free_c_string(); - __STL_FREE_STRING(_M_data, this->_M_size, this->_M_get_allocator()); + this->__STL_FREE_STRING(_M_data, this->_M_size, this->_M_get_allocator()); } #endif protected: @@ -1170,7 +1170,7 @@ protected: operator*() { if (0 == this->_M_buf_ptr) - _S_setcache(*this); + this->_S_setcache(*this); return *this->_M_buf_ptr; } @@ -1299,7 +1299,7 @@ protected: _M_root_rope(__r) { _RopeRep::_S_ref(this->_M_root); if (!(__r -> empty())) - _S_setcache(*this); + this->_S_setcache(*this); } void _M_check(); diff --git a/libstdc++-v3/include/ext/ropeimpl.h b/libstdc++-v3/include/ext/ropeimpl.h index 467b8fd93d2..3ee06104c60 100644 --- a/libstdc++-v3/include/ext/ropeimpl.h +++ b/libstdc++-v3/include/ext/ropeimpl.h @@ -380,7 +380,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Rope_RopeLeaf<_CharT, _Alloc>* __l = (_Rope_RopeLeaf<_CharT, _Alloc>*)this; __l->_Rope_RopeLeaf<_CharT, _Alloc>::~_Rope_RopeLeaf(); - _L_deallocate(__l, 1); + this->_L_deallocate(__l, 1); break; } case __detail::_S_concat: @@ -389,7 +389,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION = (_Rope_RopeConcatenation<_CharT, _Alloc>*)this; __c->_Rope_RopeConcatenation<_CharT, _Alloc>:: ~_Rope_RopeConcatenation(); - _C_deallocate(__c, 1); + this->_C_deallocate(__c, 1); break; } case __detail::_S_function: @@ -397,7 +397,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Rope_RopeFunction<_CharT, _Alloc>* __f = (_Rope_RopeFunction<_CharT, _Alloc>*)this; __f->_Rope_RopeFunction<_CharT, _Alloc>::~_Rope_RopeFunction(); - _F_deallocate(__f, 1); + this->_F_deallocate(__f, 1); break; } case __detail::_S_substringfn: @@ -406,7 +406,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION (_Rope_RopeSubstring<_CharT, _Alloc>*)this; __ss->_Rope_RopeSubstring<_CharT, _Alloc>:: ~_Rope_RopeSubstring(); - _S_deallocate(__ss, 1); + this->_S_deallocate(__ss, 1); break; } } @@ -430,7 +430,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { size_t __old_len = __r->_M_size; _CharT* __new_data = (_CharT*) - _Data_allocate(_S_rounded_up_size(__old_len + __len)); + rope::_Data_allocate(_S_rounded_up_size(__old_len + __len)); _RopeLeaf* __result; uninitialized_copy_n(__r->_M_data, __old_len, __new_data); @@ -511,7 +511,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } __catch(...) { - _C_deallocate(__result,1); + rope::_C_deallocate(__result,1); __throw_exception_again; } // In case of exception, we need to deallocate @@ -814,7 +814,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (__result_len > __lazy_threshold) goto lazy; __section = (_CharT*) - _Data_allocate(_S_rounded_up_size(__result_len)); + rope::_Data_allocate(_S_rounded_up_size(__result_len)); __try { (*(__f->_M_fn))(__start, __result_len, __section); } __catch(...) diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index f8ea41cc3ee..40cf87030b5 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -62,6 +62,12 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION + template + class _Mem_fn; + template + _Mem_fn<_Tp _Class::*> + mem_fn(_Tp _Class::*); + _GLIBCXX_HAS_NESTED_TYPE(result_type) /// If we have found a result_type, extract it. @@ -496,9 +502,6 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) // @} group functors - template - class _Mem_fn; - /** * Derives from @c unary_function or @c binary_function, or perhaps * nothing, depending on the number of arguments provided. The diff --git a/libstdc++-v3/include/tr1/exp_integral.tcc b/libstdc++-v3/include/tr1/exp_integral.tcc index cf3bd63536b..6a49b354cae 100644 --- a/libstdc++-v3/include/tr1/exp_integral.tcc +++ b/libstdc++-v3/include/tr1/exp_integral.tcc @@ -59,6 +59,8 @@ namespace tr1 { _GLIBCXX_BEGIN_NAMESPACE_VERSION + template _Tp __expint_E1(const _Tp); + /** * @brief Return the exponential integral @f$ E_1(x) @f$ * by series summation. This should be good diff --git a/libstdc++-v3/include/tr1/functional b/libstdc++-v3/include/tr1/functional index 31e72d63ab5..7651326955a 100644 --- a/libstdc++-v3/include/tr1/functional +++ b/libstdc++-v3/include/tr1/functional @@ -52,6 +52,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template class _Mem_fn; + template + _Mem_fn<_Tp _Class::*> + mem_fn(_Tp _Class::*); /** * Actual implementation of _Has_result_type, which uses SFINAE to diff --git a/libstdc++-v3/testsuite/util/exception/safety.h b/libstdc++-v3/testsuite/util/exception/safety.h index 9468bffd8d5..b85f7fe4e5f 100644 --- a/libstdc++-v3/testsuite/util/exception/safety.h +++ b/libstdc++-v3/testsuite/util/exception/safety.h @@ -1196,20 +1196,20 @@ namespace __gnu_test // constructor or assignment operator of value_type throws. if (!traits::has_throwing_erase::value) { - _M_erasep(_M_container); - _M_eraser(_M_container); + this->_M_erasep(_M_container); + this->_M_eraser(_M_container); } - _M_popf(_M_container); - _M_popb(_M_container); + this->_M_popf(_M_container); + this->_M_popb(_M_container); - _M_iops(_M_container); - _M_ciops(_M_container); + this->_M_iops(_M_container); + this->_M_ciops(_M_container); - _M_swap(_M_container); + this->_M_swap(_M_container); // Last. - _M_clear(_M_container); + this->_M_clear(_M_container); } } }; diff --git a/libstdc++-v3/testsuite/util/native_type/native_priority_queue.hpp b/libstdc++-v3/testsuite/util/native_type/native_priority_queue.hpp index 4367fca3016..dad913fa0ab 100644 --- a/libstdc++-v3/testsuite/util/native_type/native_priority_queue.hpp +++ b/libstdc++-v3/testsuite/util/native_type/native_priority_queue.hpp @@ -188,7 +188,7 @@ namespace __gnu_pbds modify(const_reference r_old, const_reference r_new) { erase(r_old); - push(r_new); + this->push(r_new); } void diff --git a/libstdc++-v3/testsuite/util/testsuite_io.h b/libstdc++-v3/testsuite/util/testsuite_io.h index 681448aa51f..4251b710715 100644 --- a/libstdc++-v3/testsuite/util/testsuite_io.h +++ b/libstdc++-v3/testsuite/util/testsuite_io.h @@ -144,7 +144,7 @@ namespace __gnu_test { p[0] = char_type('s'); p[1] = char_type(); - setg(p, p, p + 1); + this->setg(p, p, p + 1); } virtual int_type underflow()