Commit 84b64170 by Paolo Carlini Committed by Paolo Carlini

DR 1584 PR c++/57466

/cp
2014-07-09  Paolo Carlini  <paolo.carlini@oracle.com>

	DR 1584
	PR c++/57466
	* pt.c (check_cv_quals_for_unify): Implement resolution, disregard
	cv-qualifiers of function types.

/testsuite
2014-07-09  Paolo Carlini  <paolo.carlini@oracle.com>

	DR 1584
	PR c++/57466
	* g++.dg/template/pr57466.C: New.
	* g++.dg/cpp0x/pr57466.C: Likewise.
	* g++.dg/template/unify6.C: Update.

From-SVN: r212410
parent 26e288ba
2014-07-09 Paolo Carlini <paolo.carlini@oracle.com>
DR 1584
PR c++/57466
* pt.c (check_cv_quals_for_unify): Implement resolution, disregard
cv-qualifiers of function types.
2014-07-09 Andrew Sutton <andrew.n.sutton@gmail.com> 2014-07-09 Andrew Sutton <andrew.n.sutton@gmail.com>
Paolo Carlini <paolo.carlini@oracle.com> Paolo Carlini <paolo.carlini@oracle.com>
......
...@@ -17189,6 +17189,11 @@ check_cv_quals_for_unify (int strict, tree arg, tree parm) ...@@ -17189,6 +17189,11 @@ check_cv_quals_for_unify (int strict, tree arg, tree parm)
int arg_quals = cp_type_quals (arg); int arg_quals = cp_type_quals (arg);
int parm_quals = cp_type_quals (parm); int parm_quals = cp_type_quals (parm);
/* DR 1584: cv-qualification of a deduced function type is
ignored; see 8.3.5 [dcl.fct]. */
if (TREE_CODE (arg) == FUNCTION_TYPE)
return 1;
if (TREE_CODE (parm) == TEMPLATE_TYPE_PARM if (TREE_CODE (parm) == TEMPLATE_TYPE_PARM
&& !(strict & UNIFY_ALLOW_OUTER_MORE_CV_QUAL)) && !(strict & UNIFY_ALLOW_OUTER_MORE_CV_QUAL))
{ {
......
2014-07-09 Paolo Carlini <paolo.carlini@oracle.com>
DR 1584
PR c++/57466
* g++.dg/template/pr57466.C: New.
* g++.dg/cpp0x/pr57466.C: Likewise.
* g++.dg/template/unify6.C: Update.
2014-07-09 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> 2014-07-09 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* gfortran.dg/ieee/underflow_1.f90: New file. * gfortran.dg/ieee/underflow_1.f90: New file.
......
// PR c++/57466
// { dg-do compile { target c++11 } }
template<typename T>
constexpr bool
is_pointer(const T*)
{ return true; }
template<typename T>
constexpr bool
is_pointer(const T&)
{ return false; }
using F = void();
constexpr F* f = nullptr;
static_assert( is_pointer(f), "function pointer is a pointer" );
// DR 1584, PR c++/57466
template<class T> void f2(const T*);
void g2();
void m() {
f2(g2); // OK: cv-qualification of deduced function type ignored
}
...@@ -3,21 +3,20 @@ ...@@ -3,21 +3,20 @@
void Baz (); void Baz ();
template <typename T> void Foo1 (T *); // #1 template <typename T> void Foo1 (T *);
template <typename T> void Foo1 (T const *a) {a (1);} // #2 template <typename T> void Foo1 (T const *a) {a (1);} // { dg-error "too many arguments" }
template <typename T> T const *Foo2 (T *); template <typename T> T const *Foo2 (T *);
template <typename T> void Foo3 (T *, T const * = 0); // { dg-message "note" } template <typename T> void Foo3 (T *, T const * = 0);
void Bar () void Bar ()
{ {
Foo1 (&Baz); // #1 Foo1 (&Baz); // { dg-message "required from here" }
Foo2 (&Baz); Foo2 (&Baz);
Foo3 (&Baz); Foo3 (&Baz);
Foo3 (&Baz, &Baz); // { dg-error "no matching function" "" } Foo3 (&Baz, &Baz);
// { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 21 }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment