diff options
author | Jason Merrill <jason@redhat.com> | 2013-02-05 23:24:18 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-02-05 23:24:18 -0500 |
commit | ea48c8a0264d397509944ff69ec5d2289663243a (patch) | |
tree | f98d684ed96f2d3bd9320c4113d81afec7fff116 /gcc | |
parent | a283c407619b032551995bec2a0732ea094a834c (diff) | |
download | gcc-ea48c8a0264d397509944ff69ec5d2289663243a.zip gcc-ea48c8a0264d397509944ff69ec5d2289663243a.tar.gz gcc-ea48c8a0264d397509944ff69ec5d2289663243a.tar.bz2 |
re PR c++/54122 (segfault comparing enum class in lambda inside constructor of a templated class)
PR c++/54122
* tree.c (lvalue_kind) [INDIRECT_REF]: Don't check for
METHOD_TYPE.
From-SVN: r195781
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/tree.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C | 11 |
3 files changed, 16 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a2bd701..a5f944b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2013-02-05 Jason Merrill <jason@redhat.com> + PR c++/54122 + * tree.c (lvalue_kind) [INDIRECT_REF]: Don't check for + METHOD_TYPE. + PR c++/56177 * decl.c (start_preparsed_function): Update restype if we change decl1. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index d1f14fc..18d9a98 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -143,9 +143,7 @@ lvalue_kind (const_tree ref) case ARRAY_REF: case PARM_DECL: case RESULT_DECL: - if (TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE) - return clk_ordinary; - break; + return clk_ordinary; /* A scope ref in a template, left as SCOPE_REF to support later access checking. */ diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C new file mode 100644 index 0000000..6e25c33 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this7.C @@ -0,0 +1,11 @@ +// PR c++/54122 +// { dg-options -std=c++11 } + +enum E { F }; + +template <typename A> +struct C +{ + E e; + void f () { auto l = [&](void)->void { if (e == F) return; }; } +}; |