+2014-08-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/62072
+ Revert:
+ 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-08-15 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* call.c (build_conditional_expr_1): Use OPT_Wextra in warning.
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))
{
+2014-08-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/62072
+ Revert:
+ 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.
+
+ * g++.dg/cpp0x/sfinae52.C: New.
+
2014-08-15 Ilya Tocar <tocarip@gmail.com>
PR target/61878
+++ /dev/null
-// 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" );
--- /dev/null
+// PR c++/62072
+// { dg-do compile { target c++11 } }
+
+template<typename T> struct tuple_size {};
+template<typename T> struct tuple_size<T const> : tuple_size<T> {};
+
+template<typename T, typename = void>
+struct query {
+ static constexpr bool value = false;
+};
+template<typename T>
+struct query<T, typename tuple_size<T>::type> {
+ static constexpr bool value = true;
+};
+
+// fine
+static_assert( !query<int>::value, "" );
+static_assert( !query<int const>::value, "" );
+
+// error: invalid use of incomplete type 'struct tuple_size<void()>'
+static_assert( !query<void()>::value, "" );
+++ /dev/null
-// 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
-}
void Baz ();
-template <typename T> void Foo1 (T *);
-template <typename T> void Foo1 (T const *a) {a (1);} // { dg-error "too many arguments" }
+template <typename T> void Foo1 (T *); // #1
+template <typename T> void Foo1 (T const *a) {a (1);} // #2
template <typename T> T const *Foo2 (T *);
-template <typename T> void Foo3 (T *, T const * = 0);
+template <typename T> void Foo3 (T *, T const * = 0); // { dg-message "note" }
void Bar ()
{
- Foo1 (&Baz); // { dg-message "required from here" }
+ Foo1 (&Baz); // #1
Foo2 (&Baz);
Foo3 (&Baz);
- Foo3 (&Baz, &Baz);
+ Foo3 (&Baz, &Baz); // { dg-error "no matching function" "" }
+ // { dg-message "(candidate|incompatible cv-qualifiers)" "candidate note" { target *-*-* } 21 }
}