diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/expr.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const8.C | 19 |
3 files changed, 32 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bbf76ea..c661d46 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-06-02 Jason Merrill <jason@redhat.com> + + PR c++/85761 - ICE with ill-formed use of const outer variable. + * expr.c (mark_use): Handle location wrappers. + 2018-06-01 Jason Merrill <jason@redhat.com> PR c++/85764 - bogus 'this' not captured error. diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c index 0d0a10ec..9780b75 100644 --- a/gcc/cp/expr.c +++ b/gcc/cp/expr.c @@ -139,6 +139,9 @@ mark_use (tree expr, bool rvalue_p, bool read_p, break; } } + temp_override<location_t> l (input_location); + if (loc != UNKNOWN_LOCATION) + input_location = loc; expr = process_outer_var_ref (expr, tf_warning_or_error, true); if (!(TREE_TYPE (oexpr) && TYPE_REF_P (TREE_TYPE (oexpr)))) @@ -184,6 +187,11 @@ mark_use (tree expr, bool rvalue_p, bool read_p, } break; default: + if (location_wrapper_p (expr)) + { + loc = EXPR_LOCATION (expr); + recurse_op[0] = true; + } break; } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const8.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const8.C new file mode 100644 index 0000000..41cfd43 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const8.C @@ -0,0 +1,19 @@ +// PR c++/85761 +// { dg-do compile { target c++11 } } + +template <typename T> +void out(const T& value); + +struct foo { + void bar(); +}; + +void foo::bar() +{ + constexpr int COUNT = 10000; + auto run = []() { + out(COUNT); // { dg-error "9:not captured" } + }; + + run(); +} |