From 30288f9aa21c6ef870bdf792a1eee4f90fd2c468 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 7 Sep 2011 13:11:37 -0400 Subject: [PATCH] pt.c (type_unification_real): Correct complain arg for tsubsting default template args. * pt.c (type_unification_real): Correct complain arg for tsubsting default template args. From-SVN: r178651 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 11 ++++++----- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/cpp0x/sfinae11.C | 1 + libstdc++-v3/ChangeLog | 5 +++++ libstdc++-v3/testsuite/20_util/bind/ref_neg.cc | 4 ++-- libstdc++-v3/testsuite/20_util/duration/cons/1_neg.cc | 4 ++-- 7 files changed, 23 insertions(+), 9 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6d8430e..ea67d2d 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 d883c16..d326c84 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 07cd593..5247ac6 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 e62c089..25902cb 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 7c57a51..b3d4dbb 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 daa815c..f5a08c2 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 eddd57c..97f4ef1 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" } } -- 2.7.4