On Wed, 19 Mar 2014, Bill Schmidt wrote:

> Hi,
> 
> This patch (diff-pr54537) backports a fix for PR54537 which is unrelated
> but necessary.  Copying Richard and Jakub for the common code.

Ok.

Thanks,
Richard.

> Thanks,
> Bill
> 
> 
> [libstdc++-v3]
> 
> 2014-03-29  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
> 
>         Backport from mainline
>       2013-08-01  Fabien Chêne  <fab...@gcc.gnu.org>
> 
>       PR c++/54537
>       * include/tr1/cmath: Remove pow(double,double) overload, remove a
>       duplicated comment about DR 550. Add a comment to explain the issue.
>       * testsuite/tr1/8_c_compatibility/cmath/pow_cmath.cc: New.
> 
> [gcc/cp]
> 
> 2014-03-29  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
> 
>       Back port from mainline
>       2013-08-01  Fabien Chêne  <fab...@gcc.gnu.org>
> 
>       PR c++/54537
>       * cp-tree.h: Check OVL_USED with OVERLOAD_CHECK.
>       * name-lookup.c (do_nonmember_using_decl): Make sure we have an
>       OVERLOAD before calling OVL_USED. Call diagnose_name_conflict
>       instead of issuing an error without mentioning the conflicting
>       declaration.
> 
> [gcc/testsuite]
> 
> 2014-03-29  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
> 
>       Back port from mainline
>       2013-08-01  Fabien Chêne  <fab...@gcc.gnu.org>
>                   Peter Bergner  <berg...@vnet.ibm.com>
> 
>       PR c++/54537
>       * g++.dg/overload/using3.C: New.
>       * g++.dg/overload/using2.C: Adjust.
>       * g++.dg/lookup/using9.C: Likewise.
> 
> 
> Index: gcc-4_8-test/gcc/cp/cp-tree.h
> ===================================================================
> --- gcc-4_8-test.orig/gcc/cp/cp-tree.h
> +++ gcc-4_8-test/gcc/cp/cp-tree.h
> @@ -331,7 +331,7 @@ typedef struct ptrmem_cst * ptrmem_cst_t
>  /* If set, this was imported in a using declaration.
>     This is not to confuse with being used somewhere, which
>     is not important for this node.  */
> -#define OVL_USED(NODE)               TREE_USED (NODE)
> +#define OVL_USED(NODE)               TREE_USED (OVERLOAD_CHECK (NODE))
>  /* If set, this OVERLOAD was created for argument-dependent lookup
>     and can be freed afterward.  */
>  #define OVL_ARG_DEPENDENT(NODE) TREE_LANG_FLAG_0 (OVERLOAD_CHECK
> (NODE))
> Index: gcc-4_8-test/gcc/cp/name-lookup.c
> ===================================================================
> --- gcc-4_8-test.orig/gcc/cp/name-lookup.c
> +++ gcc-4_8-test/gcc/cp/name-lookup.c
> @@ -2286,8 +2286,7 @@ push_overloaded_decl_1 (tree decl, int f
>                 && compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)),
>                               TYPE_ARG_TYPES (TREE_TYPE (decl)))
>                 && ! decls_match (fn, decl))
> -             error ("%q#D conflicts with previous using declaration %q#D",
> -                    decl, fn);
> +             diagnose_name_conflict (decl, fn);
>  
>             dup = duplicate_decls (decl, fn, is_friend);
>             /* If DECL was a redeclaration of FN -- even an invalid
> @@ -2519,7 +2518,7 @@ do_nonmember_using_decl (tree scope, tre
>                 if (new_fn == old_fn)
>                   /* The function already exists in the current namespace.  */
>                   break;
> -               else if (OVL_USED (tmp1))
> +               else if (TREE_CODE (tmp1) == OVERLOAD && OVL_USED (tmp1))
>                   continue; /* this is a using decl */
>                 else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (new_fn)),
>                                     TYPE_ARG_TYPES (TREE_TYPE (old_fn))))
> @@ -2534,7 +2533,7 @@ do_nonmember_using_decl (tree scope, tre
>                       break;
>                     else
>                       {
> -                       error ("%qD is already declared in this scope", name);
> +                       diagnose_name_conflict (new_fn, old_fn);
>                         break;
>                       }
>                   }
> Index: gcc-4_8-test/gcc/testsuite/g++.dg/lookup/using9.C
> ===================================================================
> --- gcc-4_8-test.orig/gcc/testsuite/g++.dg/lookup/using9.C
> +++ gcc-4_8-test/gcc/testsuite/g++.dg/lookup/using9.C
> @@ -21,11 +21,11 @@ void h()
>    f('h');
>    f(1);         // { dg-error "ambiguous" }
>    // { dg-message "candidate" "candidate note" { target *-*-* } 22 }
> -  void f(int);  // { dg-error "previous using declaration" }
> +  void f(int);  // { dg-error "previous declaration" }
>  }
>  
>  void m()
>  {
>    void f(int);
> -  using B::f;   // { dg-error "already declared" }
> +  using B::f;   // { dg-error "previous declaration" }
>  }
> Index: gcc-4_8-test/gcc/testsuite/g++.dg/overload/using2.C
> ===================================================================
> --- gcc-4_8-test.orig/gcc/testsuite/g++.dg/overload/using2.C
> +++ gcc-4_8-test/gcc/testsuite/g++.dg/overload/using2.C
> @@ -45,7 +45,7 @@ using std::C1;
>    extern "C" void exit (int) throw ();
>    extern "C" void *malloc (__SIZE_TYPE__) throw ()
> __attribute__((malloc));
>  
> -  void abort (void) throw ();
> +  void abort (void) throw (); // { dg-message "previous" }
>    void _exit (int) throw (); // { dg-error "conflicts" "conflicts" }
>                               // { dg-message "void _exit"
> "_exit" { target *-*-* } 49 }
>  
> @@ -54,14 +54,14 @@ using std::C1;
>                             // { dg-message "void C1" "C1" { target
> *-*-* } 53 }
>  
>    extern "C" void c2 (void) throw ();
> -  void C2 (void) throw ();
> +  void C2 (void) throw (); // { dg-message "previous" }
>  
>    int C3 (int) throw ();
>  
>  using std::malloc;
> -using std::abort; // { dg-error "already declared" }
> +using std::abort; // { dg-error "conflicts" }
>  using std::c2;
> -using std::C2; // { dg-error "already declared" }
> +using std::C2; // { dg-error "conflicts" }
>  
>  using std::c3; using other::c3;
>  using std::C3; using other::C3;
> Index: gcc-4_8-test/gcc/testsuite/g++.dg/overload/using3.C
> ===================================================================
> --- /dev/null
> +++ gcc-4_8-test/gcc/testsuite/g++.dg/overload/using3.C
> @@ -0,0 +1,16 @@
> +// { dg-do compile }
> +
> +namespace a
> +{
> +  void f(int);
> +}
> +
> +namespace b
> +{
> +  void f(int); // { dg-message "previous" }
> +  void g()
> +  {
> +    f (3);
> +  }
> +  using a::f; // { dg-error "conflicts" }
> +}
> Index: gcc-4_8-test/libstdc++-v3/include/tr1/cmath
> ===================================================================
> --- gcc-4_8-test.orig/libstdc++-v3/include/tr1/cmath
> +++ gcc-4_8-test/libstdc++-v3/include/tr1/cmath
> @@ -846,10 +846,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      nexttoward(_Tp __x, long double __y)
>      { return __builtin_nexttoward(__x, __y); }
>  
> -  // DR 550. What should the return type of pow(float,int) be?
> -  // NB: C++0x and TR1 != C++03.
> -  //   using std::pow;
> -
>    inline float
>    remainder(float __x, float __y)
>    { return __builtin_remainderf(__x, __y); }
> @@ -985,9 +981,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>  
>    // DR 550. What should the return type of pow(float,int) be?
>    // NB: C++0x and TR1 != C++03.
> -  inline double
> -  pow(double __x, double __y)
> -  { return std::pow(__x, __y); }
> +
> +  // The std::tr1::pow(double, double) overload cannot be provided
> +  // here, because it would clash with ::pow(double,double) declared
> +  // in <math.h>, if <tr1/math.h> is included at the same time (raised
> +  // by the fix of PR c++/54537). It is not possible either to use the
> +  // using-declaration 'using ::pow;' here, because if the user code
> +  // has a 'using std::pow;', it would bring the pow(*,int) averloads
> +  // in the tr1 namespace, which is undesirable. Consequently, the
> +  // solution is to forward std::tr1::pow(double,double) to
> +  // std::pow(double,double) via the templatized version below. See
> +  // the discussion about this issue here:
> +  // http://gcc.gnu.org/ml/gcc-patches/2012-09/msg01278.html
>  
>    inline float
>    pow(float __x, float __y)
> Index: gcc-4_8-test/libstdc
> ++-v3/testsuite/tr1/8_c_compatibility/cmath/pow_cmath.cc
> ===================================================================
> --- /dev/null
> +++ gcc-4_8-test/libstdc
> ++-v3/testsuite/tr1/8_c_compatibility/cmath/pow_cmath.cc
> @@ -0,0 +1,33 @@
> +// { dg-do compile }
> +
> +// Copyright (C) 2013 Free Software Foundation, Inc.
> +//
> +// This file is part of the GNU ISO C++ Library.  This library is free
> +// software; you can redistribute it and/or modify it under the
> +// terms of the GNU General Public License as published by the
> +// Free Software Foundation; either version 3, or (at your option)
> +// any later version.
> +
> +// This library is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +// GNU General Public License for more details.
> +
> +// You should have received a copy of the GNU General Public License
> along
> +// with this library; see the file COPYING3.  If not see
> +// <http://www.gnu.org/licenses/>.
> +
> +#include <cmath>
> +using std::pow;
> +#include <tr1/cmath>
> +#include <testsuite_tr1.h>
> +
> +void 
> +test01()
> +{
> +  using namespace __gnu_test;
> +
> +  float x = 2080703.375F;
> +  check_ret_type<float>(std::pow(x, 2));
> +  check_ret_type<double>(std::tr1::pow(x, 2));
> +}
> 
> 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer

Reply via email to