diff options
author | Jason Merrill <jason@redhat.com> | 2018-06-02 21:01:47 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-06-02 21:01:47 -0400 |
commit | 57ea03ad4a0dde989d1c38a0028378964104bbd7 (patch) | |
tree | 9e2732b8029516dcd3e0e3f298aeb9a2d18828fc | |
parent | dd39af4425fc44f73364faf7a1f9d79240c98c10 (diff) | |
download | gcc-57ea03ad4a0dde989d1c38a0028378964104bbd7.zip gcc-57ea03ad4a0dde989d1c38a0028378964104bbd7.tar.gz gcc-57ea03ad4a0dde989d1c38a0028378964104bbd7.tar.bz2 |
PR c++/85761 - ICE with ill-formed use of const outer variable.
* expr.c (mark_use): Handle location wrappers.
From-SVN: r261121
-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(); +} |