Commit 94aedc1c by Jason Merrill Committed by Jason Merrill

PR c++/86147 - wrong capture for template argument.

	* expr.c (mark_use): Look through NOP_EXPR.

From-SVN: r261676
parent 29305f60
2018-06-15 Jason Merrill <jason@redhat.com> 2018-06-15 Jason Merrill <jason@redhat.com>
PR c++/86147 - wrong capture for template argument.
* expr.c (mark_use): Look through NOP_EXPR.
* name-lookup.c (do_pushtag): Don't look through complete types, but * name-lookup.c (do_pushtag): Don't look through complete types, but
don't add to them either. Get context from current_binding_level. don't add to them either. Get context from current_binding_level.
* pt.c (tsubst_default_argument): Use push_to/pop_from_top_level. * pt.c (tsubst_default_argument): Use push_to/pop_from_top_level.
......
...@@ -186,12 +186,15 @@ mark_use (tree expr, bool rvalue_p, bool read_p, ...@@ -186,12 +186,15 @@ mark_use (tree expr, bool rvalue_p, bool read_p,
expr = convert_from_reference (r); expr = convert_from_reference (r);
} }
break; break;
default:
CASE_CONVERT:
case VIEW_CONVERT_EXPR:
if (location_wrapper_p (expr)) if (location_wrapper_p (expr))
{ loc = EXPR_LOCATION (expr);
loc = EXPR_LOCATION (expr); recurse_op[0] = true;
recurse_op[0] = true; break;
}
default:
break; break;
} }
......
// PR c++/86147
// { dg-do compile { target c++11 } }
template <class T, T N> struct X { };
struct A { static constexpr int value = 0; };
template<class C>
void foo() {
constexpr int N = C::value;
auto f = [&]{ X<int, N> a; };
}
int main() {
foo<A>();
return 0;
}
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