diff options
author | David Malcolm <dmalcolm@redhat.com> | 2018-04-27 18:39:18 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2018-04-27 18:39:18 +0000 |
commit | 66bd30863fe5673f902fa64a1af0a47f4911fdd2 (patch) | |
tree | 9d4bfe51102d1732770424d8fbdd728fd7a1b380 /gcc | |
parent | 2885a4939a7c96441210d6b3507524b6970d1013 (diff) | |
download | gcc-66bd30863fe5673f902fa64a1af0a47f4911fdd2.zip gcc-66bd30863fe5673f902fa64a1af0a47f4911fdd2.tar.gz gcc-66bd30863fe5673f902fa64a1af0a47f4911fdd2.tar.bz2 |
Don't offer suggestions for compiler-generated variables (PR c++/85515)
gcc/cp/ChangeLog:
PR c++/85515
* name-lookup.c (consider_binding_level): Skip compiler-generated
variables.
* search.c (lookup_field_fuzzy_info::fuzzy_lookup_field): Flatten
nested if statements into a series of rejection tests. Reject
lambda-ignored entities as suggestions.
gcc/testsuite/ChangeLog:
PR c++/85515
* g++.dg/pr85515-1.C: New test.
* g++.dg/pr85515-2.C: New test.
From-SVN: r259720
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 6 | ||||
-rw-r--r-- | gcc/cp/search.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr85515-1.C | 18 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr85515-2.C | 22 |
6 files changed, 71 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2dbc675..d8e7089 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2018-04-27 David Malcolm <dmalcolm@redhat.com> + + PR c++/85515 + * name-lookup.c (consider_binding_level): Skip compiler-generated + variables. + * search.c (lookup_field_fuzzy_info::fuzzy_lookup_field): Flatten + nested if statements into a series of rejection tests. Reject + lambda-ignored entities as suggestions. + 2018-04-27 Jason Merrill <jason@redhat.com> * cvt.c (cp_fold_convert): Use convert_ptrmem. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index c1f7cf5..2af2462 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -5860,6 +5860,12 @@ consider_binding_level (tree name, best_match <tree, const char *> &bm, && DECL_ANTICIPATED (d)) continue; + /* Skip compiler-generated variables (e.g. __for_begin/__for_end + within range for). */ + if (TREE_CODE (d) == VAR_DECL + && DECL_ARTIFICIAL (d)) + continue; + tree suggestion = DECL_NAME (d); if (!suggestion) continue; diff --git a/gcc/cp/search.c b/gcc/cp/search.c index bfeaf2c..22c0492 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1224,9 +1224,16 @@ lookup_field_fuzzy_info::fuzzy_lookup_field (tree type) for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) { - if (!m_want_type_p || DECL_DECLARES_TYPE_P (field)) - if (DECL_NAME (field)) - m_candidates.safe_push (DECL_NAME (field)); + if (m_want_type_p && !DECL_DECLARES_TYPE_P (field)) + continue; + + if (!DECL_NAME (field)) + continue; + + if (is_lambda_ignored_entity (field)) + continue; + + m_candidates.safe_push (DECL_NAME (field)); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a20bfd0..ce5eaba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-04-27 David Malcolm <dmalcolm@redhat.com> + + PR c++/85515 + * g++.dg/pr85515-1.C: New test. + * g++.dg/pr85515-2.C: New test. + 2018-04-27 Paolo Carlini <paolo.carlini@oracle.com> PR c++/84691 diff --git a/gcc/testsuite/g++.dg/pr85515-1.C b/gcc/testsuite/g++.dg/pr85515-1.C new file mode 100644 index 0000000..0e27a9d --- /dev/null +++ b/gcc/testsuite/g++.dg/pr85515-1.C @@ -0,0 +1,18 @@ +// { dg-require-effective-target c++14 } + +void test_1 () +{ + auto lambda = [val = 2](){}; + lambda.val; // { dg-bogus "did you mean" } + // { dg-error "has no member named 'val'" "" { target *-*-* } .-1 } +} + +int test_2 () +{ + auto lambda = [val = 2](){ return val; }; + + // TODO: should we issue an error for the following assignment? + lambda.__val = 4; + + return lambda(); +} diff --git a/gcc/testsuite/g++.dg/pr85515-2.C b/gcc/testsuite/g++.dg/pr85515-2.C new file mode 100644 index 0000000..621ddb8 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr85515-2.C @@ -0,0 +1,22 @@ +// { dg-require-effective-target c++11 } + +void test_1 () +{ + int arr[] = {1, 2, 3, 4, 5}; + for (const auto v: arr) { + _forbegin; // { dg-bogus "suggested alternative" } + // { dg-error "'_forbegin' was not declared in this scope" "" { target *-*-*} .-1 } + } +} + +int test_2 () +{ + int arr[] = {1, 2, 3, 4, 5}; + int sum = 0; + for (const auto v: arr) { + sum += v; + // TODO: should we issue an error for the following assignment? + __for_begin = __for_end; + } + return sum; +} |