diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6d8430e5897a..ea67d2d5d5a0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-09-07 Jason Merrill + * pt.c (type_unification_real): Correct complain arg for tsubsting + default template args. + * pt.c (tsubst_aggr_type): Check TYPE_P before tsubsting. 2011-09-06 Jason Merrill diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d883c1635fa7..d326c842c701 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -14804,6 +14804,10 @@ type_unification_real (tree tparms, if (!subr) { + tsubst_flags_t complain = (explain_p + ? tf_warning_or_error + : tf_none); + /* Check to see if we need another pass before we start clearing ARGUMENT_PACK_INCOMPLETE_P. */ for (i = 0; i < ntparms; i++) @@ -14854,11 +14858,8 @@ type_unification_real (tree tparms, { tree parm = TREE_VALUE (TREE_VEC_ELT (tparms, i)); tree arg = TREE_PURPOSE (TREE_VEC_ELT (tparms, i)); - arg = tsubst_template_arg (arg, targs, tf_none, NULL_TREE); - arg = convert_template_argument (parm, arg, targs, - (explain_p - ? tf_warning_or_error - : tf_none), + arg = tsubst_template_arg (arg, targs, complain, NULL_TREE); + arg = convert_template_argument (parm, arg, targs, complain, i, NULL_TREE); if (arg == error_mark_node) return 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 07cd5934303d..5247ac6b9849 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-09-07 Jason Merrill + + * g++.dg/cpp0x/sfinae11.C: Check for explanatory diagnostic. + 2011-09-07 Georg-Johann Lay * gcc.dg/section1.c: Don't xfail for avr. diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae11.C b/gcc/testsuite/g++.dg/cpp0x/sfinae11.C index e62c08984e78..25902cbd65e8 100644 --- a/gcc/testsuite/g++.dg/cpp0x/sfinae11.C +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae11.C @@ -52,5 +52,6 @@ int main() noexcept( f1(z) ); // { dg-message "required" } static_assert( noexcept( f2(z) ), "shall be ill-formed." ); // { dg-error "no match|could not convert" } + // { dg-error "no member" "" { target *-*-* } 54 } noexcept( f3(z) ); // { dg-message "required" } } diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7c57a5108638..b3d4dbb00b5b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2011-09-07 Jason Merrill + + * testsuite/20_util/bind/ref_neg.cc: Adjust errors. + * testsuite/20_util/duration/cons/1_neg.cc: Adjust errors. + 2011-09-06 Benjamin Kosnik * include/std/tuple (_Tuple_impl::_M_head, _M_tail): Mark constexpr. diff --git a/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc b/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc index daa815c54d97..f5a08c2630a9 100644 --- a/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc +++ b/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc @@ -29,8 +29,8 @@ int inc(int& i) { return ++i; } void test01() { const int dummy = 0; - std::bind(&inc, _1)(0); // { dg-error "no match" } - std::bind(&inc, std::ref(dummy))(); // { dg-error "no match" } + std::bind(&inc, _1)(0); // { dg-error "no match|rvalue" } + std::bind(&inc, std::ref(dummy))(); // { dg-error "no match|const" } } struct Inc diff --git a/libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc b/libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc index eddd57ce0355..97f4ef14002a 100644 --- a/libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc +++ b/libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc @@ -26,7 +26,7 @@ void test01() { - std::chrono::duration d1(1.0); // { dg-error "no matching" } + std::chrono::duration d1(1.0); // { dg-error "no matching|no type" } } void @@ -35,6 +35,6 @@ test02() using namespace std::chrono; duration d2(8); - duration d2_copy(d2); // { dg-error "no matching" } + duration d2_copy(d2); // { dg-error "no matching|no type" } }