From 0a5ec6afbe36caf8d7712dba36a4998d6cc8e2e4 Mon Sep 17 00:00:00 2001 From: asutton Date: Fri, 20 Mar 2015 15:37:43 +0000 Subject: [PATCH] 2015-03-20 Andrew Sutton Ensure that empty expansions are satisfied. * gcc/cp/constraint.cc (check_pack_expansion): Empty expansions are satsified. * gcc/testsuite/g++.dg/concepts/template-parm11.C: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/c++-concepts@221536 138bc75d-0d04-0410-961f-82ee72b054a4 --- ChangeLog.concepts | 7 +++++++ gcc/cp/constraint.cc | 7 ++++++- gcc/testsuite/g++.dg/concepts/template-parm11.C | 20 ++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/concepts/template-parm11.C diff --git a/ChangeLog.concepts b/ChangeLog.concepts index 76475b607c7..c1dc635926e 100644 --- a/ChangeLog.concepts +++ b/ChangeLog.concepts @@ -1,5 +1,12 @@ 2015-03-20 Andrew Sutton + Ensure that empty expansions are satisfied. + * gcc/cp/constraint.cc (check_pack_expansion): Empty expansions + are satsified. + * gcc/testsuite/g++.dg/concepts/template-parm11.C: New. + +2015-03-20 Andrew Sutton + Fix regression in variadic constraint processing. * gcc/cp/pt.c (tsubst_pack_expansion): Expose declaration. * gcc/cp/constraint.cc: Rename lift_constraints to diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index 9e4e41f1ff8..f9b8ecee39c 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -1546,11 +1546,16 @@ check_pack_expansion (tree t, tree args, tree exprs = tsubst_pack_expansion (t, args, complain, in_decl); if (exprs == error_mark_node) return boolean_false_node; + int n = TREE_VEC_LENGTH (exprs); + + /* An empty expansion is inherently satisfied. */ + if (n == 0) + return boolean_true_node; /* Build a conjunction of constraints from the resulting expansions and then check that. */ tree result = NULL_TREE; - for (int i = 0; i < TREE_VEC_LENGTH (exprs); ++i) + for (int i = 0; i < n; ++i) { tree expr = TREE_VEC_ELT (exprs, i); tree constr = transform_expression (expr); diff --git a/gcc/testsuite/g++.dg/concepts/template-parm11.C b/gcc/testsuite/g++.dg/concepts/template-parm11.C new file mode 100644 index 00000000000..c246850bf8f --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/template-parm11.C @@ -0,0 +1,20 @@ +// { dg-options "-std=c++1z" } + +template +concept bool NameProvider() +{ + return requires(){ + T::_name_t::template _member_t; + }; +} + +template +void getTable(const ColSpec&...) +{} + +int f() +{ + getTable(7, 'a'); // { dg-error "cannot call" } +}; + +// { dg-excess-errors "ColSpec|false" } -- 2.11.4.GIT