From 28ca05f00ab3fbf9a478457e68e02178597dd342 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 14 Sep 2016 23:55:10 +0200 Subject: [PATCH] re PR c++/77549 (ICE on invalid C++ code that references undeclared variable) PR c++/77549 * name-lookup.c (consider_binding_level): Look through TREE_LIST and OVERLOAD. * g++.dg/lookup/pr77549.C: New test. From-SVN: r240148 --- gcc/cp/ChangeLog | 6 +++ gcc/cp/name-lookup.c | 22 +++++++--- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/lookup/pr77549.C | 76 +++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lookup/pr77549.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 001479c..26d730e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-09-14 Jakub Jelinek + + PR c++/77549 + * name-lookup.c (consider_binding_level): Look through TREE_LIST + and OVERLOAD. + 2016-09-14 Marek Polacek * typeck.c (cp_build_unary_op): Diagnose incrementing boolean diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 022ab6a..952d8b7 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -4707,19 +4707,29 @@ consider_binding_level (tree name, best_match &bm, for (tree t = lvl->names; t; t = TREE_CHAIN (t)) { + tree d = t; + + /* OVERLOADs or decls from using declaration are wrapped into + TREE_LIST. */ + if (TREE_CODE (d) == TREE_LIST) + { + d = TREE_VALUE (d); + d = OVL_CURRENT (d); + } + /* Don't use bindings from implicitly declared functions, as they were likely misspellings themselves. */ - if (TREE_TYPE (t) == error_mark_node) + if (TREE_TYPE (d) == error_mark_node) continue; /* Skip anticipated decls of builtin functions. */ - if (TREE_CODE (t) == FUNCTION_DECL - && DECL_BUILT_IN (t) - && DECL_ANTICIPATED (t)) + if (TREE_CODE (d) == FUNCTION_DECL + && DECL_BUILT_IN (d) + && DECL_ANTICIPATED (d)) continue; - if (DECL_NAME (t)) - bm.consider (DECL_NAME (t)); + if (DECL_NAME (d)) + bm.consider (DECL_NAME (d)); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dc55a3d..023fcd4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-09-14 Jakub Jelinek + + PR c++/77549 + * g++.dg/lookup/pr77549.C: New test. + 2016-09-14 Marek Polacek * c-c++-common/gomp/atomic-12.c: Use -Wno-deprecated. diff --git a/gcc/testsuite/g++.dg/lookup/pr77549.C b/gcc/testsuite/g++.dg/lookup/pr77549.C new file mode 100644 index 0000000..6fe1a0e --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/pr77549.C @@ -0,0 +1,76 @@ +// PR c++/77549 +// { dg-do compile } + +struct A +{ + static int x; +}; + +void +f1 () +{ + using ::A; + x; // { dg-error "'x' was not declared in this scope" } +} + +namespace N +{ + int bar; +} + +void +f2 () +{ + using N::bar; + baz++; // { dg-error "'baz' was not declared in this scope" } +} // { dg-message "note: suggested alternative: 'bar'" "" { target *-*-* } 25 } + +int +bar () +{ + return 0; +} + +namespace M +{ + int + bar () + { + return 0; + } +} + +void +f3 () +{ + using M::bar; + baz (); // { dg-error "'baz' was not declared in this scope" } +} // { dg-message "note: suggested alternative: 'bar'" "" { target *-*-* } 47 } + +namespace O +{ + int + foo () + { + return 0; + } +} + +namespace P +{ + int + bar () + { + return 0; + } +} + +void +f4 () +{ + using O::foo; + using P::bar; + fooo (); // { dg-error "'fooo' was not declared in this scope" } + // { dg-message "note: suggested alternative: 'foo'" "" { target *-*-* } 73 } + baz (); // { dg-error "'baz' was not declared in this scope" } +} // { dg-message "note: suggested alternative: 'bar'" "" { target *-*-* } 75 } -- 2.7.4