Commit 38a79c5a by Jason Merrill Committed by Jason Merrill

PR c++/69300 - ICE with self-referential noexcept

	* pt.c (maybe_instantiate_noexcept): Check for recursion.

From-SVN: r249757
parent 7e61b3d4
2017-06-28 Jason Merrill <jason@redhat.com>
PR c++/69300 - ICE with self-referential noexcept
* pt.c (maybe_instantiate_noexcept): Check for recursion.
PR c++/61022 - error with variadic template template parm
* pt.c (convert_template_argument): Keep the TYPE_PACK_EXPANSION.
......
......@@ -22557,8 +22557,20 @@ maybe_instantiate_noexcept (tree fn)
if (TREE_CODE (noex) == DEFERRED_NOEXCEPT)
{
static hash_set<tree>* fns = new hash_set<tree>;
bool added = false;
if (DEFERRED_NOEXCEPT_PATTERN (noex) == NULL_TREE)
spec = get_defaulted_eh_spec (fn);
else if (!(added = !fns->add (fn)))
{
/* If hash_set::add returns true, the element was already there. */
location_t loc = EXPR_LOC_OR_LOC (DEFERRED_NOEXCEPT_PATTERN (noex),
DECL_SOURCE_LOCATION (fn));
error_at (loc,
"exception specification of %qD depends on itself",
fn);
spec = noexcept_false_spec;
}
else if (push_tinst_level (fn))
{
push_access_scope (fn);
......@@ -22579,6 +22591,9 @@ maybe_instantiate_noexcept (tree fn)
else
spec = noexcept_false_spec;
if (added)
fns->remove (fn);
TREE_TYPE (fn) = build_exception_variant (fntype, spec);
}
......
// PR c++/69300
// { dg-do compile { target c++11 } }
template<typename A>
struct F {
template<typename B>
void f() noexcept(&F::template f<B>) {} // { dg-error "exception specification" }
};
int main () {
F<void>().f<int>();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment