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

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

From-SVN: r261676
This commit is contained in:
Jason Merrill 2018-06-16 02:35:53 -04:00 committed by Jason Merrill
parent 29305f6018
commit 94aedc1c0e
3 changed files with 28 additions and 5 deletions

View file

@ -1,5 +1,8 @@
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
don't add to them either. Get context from current_binding_level.
* pt.c (tsubst_default_argument): Use push_to/pop_from_top_level.

View file

@ -186,12 +186,15 @@ mark_use (tree expr, bool rvalue_p, bool read_p,
expr = convert_from_reference (r);
}
break;
default:
CASE_CONVERT:
case VIEW_CONVERT_EXPR:
if (location_wrapper_p (expr))
{
loc = EXPR_LOCATION (expr);
recurse_op[0] = true;
}
loc = EXPR_LOCATION (expr);
recurse_op[0] = true;
break;
default:
break;
}

View file

@ -0,0 +1,17 @@
// 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;
}