aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2014-07-09 21:23:06 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2014-07-09 21:23:06 +0000
commit84b64170630dee8583c444e6dbf9df00fe6e88b5 (patch)
tree9059ca11989c432e928aef7188811026c0257196 /gcc
parent26e288bab56e529b3249c580ad31da4f0e77d76f (diff)
downloadgcc-84b64170630dee8583c444e6dbf9df00fe6e88b5.zip
gcc-84b64170630dee8583c444e6dbf9df00fe6e88b5.tar.gz
gcc-84b64170630dee8583c444e6dbf9df00fe6e88b5.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr57466.C18
-rw-r--r--gcc/testsuite/g++.dg/template/pr57466.C8
-rw-r--r--gcc/testsuite/g++.dg/template/unify6.C11
6 files changed, 51 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f1832ce4..6174193 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+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>
Paolo Carlini <paolo.carlini@oracle.com>
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 7bbbf03..7b79280 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -17189,6 +17189,11 @@ check_cv_quals_for_unify (int strict, tree arg, tree parm)
int arg_quals = cp_type_quals (arg);
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
&& !(strict & UNIFY_ALLOW_OUTER_MORE_CV_QUAL))
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e4cd3bc..675e343 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+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>
* gfortran.dg/ieee/underflow_1.f90: New file.
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr57466.C b/gcc/testsuite/g++.dg/cpp0x/pr57466.C
new file mode 100644
index 0000000..792a3cb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/pr57466.C
@@ -0,0 +1,18 @@
+// 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" );
diff --git a/gcc/testsuite/g++.dg/template/pr57466.C b/gcc/testsuite/g++.dg/template/pr57466.C
new file mode 100644
index 0000000..6dd3710
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr57466.C
@@ -0,0 +1,8 @@
+// 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
+}
diff --git a/gcc/testsuite/g++.dg/template/unify6.C b/gcc/testsuite/g++.dg/template/unify6.C
index 551c96e..374bb91 100644
--- a/gcc/testsuite/g++.dg/template/unify6.C
+++ b/gcc/testsuite/g++.dg/template/unify6.C
@@ -3,21 +3,20 @@
void Baz ();
-template <typename T> void Foo1 (T *); // #1
-template <typename T> void Foo1 (T const *a) {a (1);} // #2
+template <typename T> void Foo1 (T *);
+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> void Foo3 (T *, T const * = 0); // { dg-message "note" }
+template <typename T> void Foo3 (T *, T const * = 0);
void Bar ()
{
- Foo1 (&Baz); // #1
+ Foo1 (&Baz); // { dg-message "required from here" }
Foo2 (&Baz);
Foo3 (&Baz);
- Foo3 (&Baz, &Baz); // { dg-error "no matching function" "" }
- // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 21 }
+ Foo3 (&Baz, &Baz);
}