re PR c++/24163 (dependent Base class scope examined during unqualified name lookup...
authorJason Merrill <jason@redhat.com>
Fri, 20 May 2011 18:01:22 +0000 (14:01 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 20 May 2011 18:01:22 +0000 (14:01 -0400)
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

33 files changed:
gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr47615.C
gcc/testsuite/g++.dg/overload/defarg1.C
gcc/testsuite/g++.dg/tc1/dr213.C
gcc/testsuite/g++.dg/template/koenig9.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr34850.C
gcc/testsuite/g++.dg/torture/pr39362.C
gcc/testsuite/g++.old-deja/g++.brendan/crash56.C
gcc/testsuite/g++.old-deja/g++.pt/memtemp47.C
libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/pb_ds/assoc_container.hpp
libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp
libstdc++-v3/include/ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp
libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp
libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp
libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp
libstdc++-v3/include/ext/pb_ds/detail/splay_tree_/split_join_fn_imps.hpp
libstdc++-v3/include/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp
libstdc++-v3/include/ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp
libstdc++-v3/include/ext/rc_string_base.h
libstdc++-v3/include/ext/rope
libstdc++-v3/include/ext/ropeimpl.h
libstdc++-v3/include/std/functional
libstdc++-v3/include/tr1/exp_integral.tcc
libstdc++-v3/include/tr1/functional
libstdc++-v3/testsuite/util/exception/safety.h
libstdc++-v3/testsuite/util/native_type/native_priority_queue.hpp
libstdc++-v3/testsuite/util/testsuite_io.h

index 61adf5fb9fd4657ccb480068aaa58a2f16663b85..5d93472bba3bec330bce35b44d9e65b3c667a574 100644 (file)
@@ -1,3 +1,14 @@
+2011-05-20  Jason Merrill  <jason@redhat.com>
+
+       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  <jason@redhat.com>
 
        * semantics.c (finish_call_expr): SET_EXPR_LOCATION.
index 3ccbfda2adc54dff28d1b80cc0d9df57983f526f..ada01fbd129ceed3112095af809c79497e86e112 100644 (file)
@@ -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);
index cf9286a21dd11ba1aa3d9573d80e7d466e17a1ac..2b452601e5f216f9d58f59d088a6690a15000858 100644 (file)
@@ -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);
 
index 75d0674bb40e4c647e1aff18c794daa40c9f2f09..d72596f55255bb80a95a4c77f1b519448e9bd042 100644 (file)
@@ -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 %<this->%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.  */
index 02e08e31025a5b9d856cdfd7e2ef060c85f89599..a7ca50d15e29e62e47ff963fbe6ed6fc2cca9180 100644 (file)
@@ -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)
index 2bdb809c11f6796790484aacef3e2b358ee85208..ba56b6d7745b538633430c0fe5a67d8ac5e2157e 100644 (file)
@@ -1,3 +1,14 @@
+2011-05-20  Jason Merrill  <jason@redhat.com>
+
+       * 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  <rguenther@suse.de>
 
        PR tree-optimization/49079
index bbbcbe1e47ffcf0e69c604a3977b87da43098c2f..f8dbcf7e824ad17d3e23bc53abcdf304b0f62de8 100644 (file)
@@ -360,7 +360,7 @@ template < typename Const_Node_Iterator, typename Node_Iterator, typename, typen
 {
 {
 {
-           rotate_right (p_nd);
+           this->rotate_right (p_nd);
          }
        }
       }
index 44de733736f84cc4596ade89bcad20b1ba8f42a9..5d34a457dc28f11dabfa9bb23d23c0d614560d92 100644 (file)
@@ -3,7 +3,9 @@
 template<typename T>
 int foo (T t, int = foo(T()));
 
+struct A { };
+
 int main()
 {
-  foo(0);                      // { dg-error "default argument" }
+  foo(A());                    // { dg-error "default argument" }
 }
index 2cc70138acfaf7642e71d99aa214abe989dccf08..b616ff9e11a99b62cbac2427fbb611250b483442 100644 (file)
@@ -8,7 +8,7 @@
 template <class T> 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<B> ab;   // { dg-error "" "" { xfail *-*-* } }
+  A<B> 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 (file)
index 0000000..ae74a47
--- /dev/null
@@ -0,0 +1,33 @@
+// PR c++/29131
+// int has no associated namespaces, so arg-dep lookup doesn't find g(int).
+
+template <class T> int f() { return g(T()); } // { dg-error "argument-dependent" }
+int g(int);                                  // { dg-message "declared here" }
+int i = f<int>();
+
+// PR c++/24163
+// Unqualified lookup doesn't find names from dependent bases.
+
+template <class T>
+struct A
+{
+  static void h(T);
+};
+
+template <class T> struct B: A<T>
+{
+  void f() { h(T()); }         // { dg-error "argument-dependent" }
+  static void g() { h(T()); }  // { dg-error "argument-dependent" }
+};
+
+int main()
+{
+  B<int> 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 }
index 4f630f8371c39ff6d246760c900bc2749ae72f30..5e30f1dab6587fb97ca486a6a1709f9d6ed99b39 100644 (file)
@@ -48,7 +48,7 @@ template<typename T> void MemoryRegion<T>::create(u32bit n)    {
 template<typename T> class SecureVector : public MemoryRegion<T>    {
 public:
     SecureVector<T>& operator=(const MemoryRegion<T>& in)          {
-       if(this != &in) set(in);
+       if(this != &in) this->set(in);
     }
 };
 class OctetString    {
index fb23439f595c3fa6efedc74aee4f9d0862fdd63b..e7b0774d96f17f4acb22e6dc237f617c530e6c1c 100644 (file)
@@ -55,7 +55,7 @@ template <typename T, int cap> class I;
 template <typename T> struct I <T, 0> : H <T>
 {
   I (int capacity) { allocateBuffer (capacity); }
-  ~I () { deallocateBuffer (buffer ()); }
+  ~I () { this->deallocateBuffer (buffer ()); }
   using H <T>::allocateBuffer;
   H <T>::buffer;
 };
index ad652cf93588e9428ebe312a80e4eb50e0191e22..a22615dce6291a8da35bf6f564a86cfaf971ab07 100644 (file)
@@ -253,7 +253,7 @@ void
 SetLD<T>::add(const T& item)
 {
     if ( ! contains(item) )
-       append(item);
+      this->append(item);
 }
 template<class T>
 void
index 7ed5a24927804b73a15450b9e2f88dfee4689be8..242a299c164e43728cff290444216c9ef140dafe 100644 (file)
@@ -18,7 +18,7 @@ struct T : public S<X>
 {
   template <class U>
   void f(U u)
-  { printf ("In T::f(U)\n"); g(u); }
+  { printf ("In T::f(U)\n"); this->g(u); }
 };
 
 int main()
index f6b9159d235ada73d7a04391fe0add686e72dc95..68edbdba5c482c43987d6633b9bf9e7769bf6903 100644 (file)
@@ -1,3 +1,29 @@
+2011-05-20  Jason Merrill  <jason@redhat.com>
+
+       * 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  <paolo.carlini@oracle.com>
 
        * include/std/tuple (tuple_element<__i, const _Tp>,
index 9cec3b72c5427a95a247fc34a0fd99dbe871dfd6..12a3fc501c91c774b76a1ee84c2fdfecd0ded22b 100644 (file)
@@ -234,7 +234,7 @@ namespace __gnu_pbds
     template<typename It>
     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<typename It>
     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)
index 5a335a6dd475cbdbe9b67dd60537819caabc60fc..0ef925f079e9c4f0b30847315b85502e35af1fc5 100644 (file)
@@ -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;
          }
       }
index a0d079b142f35f8cf75c615ca4571df90e1cb57a..198caca88680d38ee6da5e7b593a1658fcebbb4e 100644 (file)
@@ -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);
index 207577cf492ba9650339070833f010256decb526..22f8e68c44028d7b7097eb207b1208a4e22355fd 100644 (file)
@@ -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
index 97441c9df46853045596405b1a182319e93b2118..4e1179ead2ffb53b9756c4843c2f547e472d29d4 100644 (file)
@@ -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);
 }
index ec38cf813140d4a2de40ed04ed544bbf3f7d1650..b1523662c43a84340dbe91d89853b5889a7a77c5 100644 (file)
@@ -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)
 }
index cb04d656933210c5b95525f70ae056242436b545..fe4cfa57bf75cca5760fe04a8ed314af5b0ba88d 100644 (file)
@@ -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))
index 1d33767a2c0058e1b7e8b4cb4b9995ae12ce52c4..d3b27925f7eb5860da6d95b44a9bd13b3aeca7c7 100644 (file)
@@ -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)?
index cdd8989295c91de38d60aa471961b445e6c44f93..ff2799e3e95402f6c2f8395cc6745fd052fd76fc 100644 (file)
@@ -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));
         }
index 4a27ff6ef5bb8834bb794dc10a53957c02fd142e..afd4d9e36888193c1cca1b6f240856870333301b 100644 (file)
@@ -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);
        }
 
index 42921516e40bfbf16ee27eec7b1d9a048f4ca5b1..5e82811757c2245d6632ae6f727105e98014922a 100644 (file)
@@ -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();
index 467b8fd93d2da3b98a713dad61c30fb2d4e23d86..3ee06104c605452876531b3b4e2fa3386e42f85d 100644 (file)
@@ -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(...)
index f8ea41cc3eeb3a93669a0dc373a87e1992aee596..40cf87030b5f0629484d8ef1572a898199a33d87 100644 (file)
@@ -62,6 +62,12 @@ namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
+  template<typename _MemberPointer>
+    class _Mem_fn;
+  template<typename _Tp, typename _Class>
+    _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<typename _MemberPointer>
-    class _Mem_fn;
-
   /**
    * Derives from @c unary_function or @c binary_function, or perhaps
    * nothing, depending on the number of arguments provided. The
index cf3bd63536ba7451624cabf6ec7dd36130035be5..6a49b354caec2c5e9c26a1249306820abdf44014 100644 (file)
@@ -59,6 +59,8 @@ namespace tr1
   {
   _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
+    template<typename _Tp> _Tp __expint_E1(const _Tp);
+
     /**
      *   @brief Return the exponential integral @f$ E_1(x) @f$
      *          by series summation.  This should be good
index 31e72d63ab5619b32509502dbba87282546e74c4..7651326955a4e998aa1b15acc63233ef786abafa 100644 (file)
@@ -52,6 +52,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   template<typename _MemberPointer>
     class _Mem_fn;
+  template<typename _Tp, typename _Class>
+    _Mem_fn<_Tp _Class::*>
+    mem_fn(_Tp _Class::*);
 
   /**
    *  Actual implementation of _Has_result_type, which uses SFINAE to
index 9468bffd8d583f1a3aca7a10dcf435e68f467219..b85f7fe4e5fddd55d371a9d6b4d72edd584de91f 100644 (file)
@@ -1196,20 +1196,20 @@ namespace __gnu_test
          // constructor or assignment operator of value_type throws.
          if (!traits<container_type>::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);
        }
       }
     };
index 4367fca3016b40523f5d16dcd714bdd9f880f7d4..dad913fa0ab1e4d2350d1a33d44439b2f7006b2d 100644 (file)
@@ -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
index 681448aa51faeb3f3fbfbb4c8ab3c538c4d5361a..4251b710715e97d2d6b64ae0a88284c2f57f6828 100644 (file)
@@ -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()