Hi, This patch (diff-pr54537) backports a fix for PR54537 which is unrelated but necessary. Copying Richard and Jakub for the common code.
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)); +}