diff options
author | Jason Merrill <jason@redhat.com> | 2020-02-04 17:18:35 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2020-02-04 17:25:09 -0500 |
commit | 85409531ff032a008ebfbb715344648f15492dac (patch) | |
tree | b921d2b26e88dd58a1501ccd1f25b266a0506e4e | |
parent | 0712ea6313bc44f9ae8feb235c1b02c92cdd0527 (diff) | |
download | gcc-85409531ff032a008ebfbb715344648f15492dac.zip gcc-85409531ff032a008ebfbb715344648f15492dac.tar.gz gcc-85409531ff032a008ebfbb715344648f15492dac.tar.bz2 |
c++: Fix error-recovery with concepts.
Here, push_tinst_level refused to push into the scope of Foo::Foo
because it was triggered from the ill-formed function fun. But we didn't
check the return value and tried to pop the un-pushed level.
PR c++/93551
* constraint.cc (satisfy_declaration_constraints): Check return
value of push_tinst_level.
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/constraint.cc | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-err1.C | 33 |
3 files changed, 39 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 956e94b..4e4235d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2020-02-04 Jason Merrill <jason@redhat.com> + PR c++/93551 + * constraint.cc (satisfy_declaration_constraints): Check return + value of push_tinst_level. + PR c++/90951 * constexpr.c (cxx_eval_array_reference): {}-initialize missing elements instead of value-initializing them. diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index cda644e..58044cd 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -2692,7 +2692,8 @@ satisfy_declaration_constraints (tree t, subst_info info) tree result = boolean_true_node; if (norm) { - push_tinst_level (t); + if (!push_tinst_level (t)) + return result; push_access_scope (t); result = satisfy_associated_constraints (norm, args, info); pop_access_scope (t); diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-err1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-err1.C new file mode 100644 index 0000000..e482ba0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-err1.C @@ -0,0 +1,33 @@ +// PR c++/93551 +// { dg-do compile { target concepts } } + +namespace std { + template<typename _Tp, _Tp __v> + struct integral_constant + { + static constexpr _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + constexpr operator value_type() const noexcept { return value; } + }; + template<typename _Base, typename _Derived> + struct is_base_of + : public integral_constant<bool, __is_base_of(_Base, _Derived)> + { }; + template <typename _Base, typename _Derived> + inline constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value; +} +class Bar { }; +struct Foo { + template <typename P> requires std::is_base_of_v<Bar, P> + Foo(P const&); +}; +template <typename P> +Foo fun(P const& arg) { + (bool)arg; // { dg-error "" } + return Foo {arg}; +} +int main() { + fun(Bar{}); + return 0; +} |