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
This commit is contained in:
parent
f6c7d678f8
commit
28ca05f00a
4 changed files with 103 additions and 6 deletions
|
@ -1,3 +1,9 @@
|
|||
2016-09-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/77549
|
||||
* name-lookup.c (consider_binding_level): Look through TREE_LIST
|
||||
and OVERLOAD.
|
||||
|
||||
2016-09-14 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
* typeck.c (cp_build_unary_op): Diagnose incrementing boolean
|
||||
|
|
|
@ -4707,19 +4707,29 @@ consider_binding_level (tree name, best_match <tree, tree> &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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2016-09-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/77549
|
||||
* g++.dg/lookup/pr77549.C: New test.
|
||||
|
||||
2016-09-14 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
* c-c++-common/gomp/atomic-12.c: Use -Wno-deprecated.
|
||||
|
|
76
gcc/testsuite/g++.dg/lookup/pr77549.C
Normal file
76
gcc/testsuite/g++.dg/lookup/pr77549.C
Normal file
|
@ -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 }
|
Loading…
Add table
Reference in a new issue