re PR c++/196 (problem with: namespace N { class N {...}; })
cp: PR c++/196 * cp/parse.y (bad_parm): Better diagnostic when given a SCOPE_REF. testsuite: * g++.dg/eh/ctor1.C: New test. * g++.dg/other/error2.C: New test. From-SVN: r48317
This commit is contained in:
parent
8a723db2df
commit
7d8e83691e
|
@ -1,3 +1,8 @@
|
|||
2001-12-26 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR c++/196
|
||||
* cp/parse.y (bad_parm): Better diagnostic when given a SCOPE_REF.
|
||||
|
||||
2001-12-24 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR c++/160
|
||||
|
|
|
@ -3766,11 +3766,16 @@ bad_parm:
|
|||
}
|
||||
| notype_declarator
|
||||
{
|
||||
error ("type specifier omitted for parameter");
|
||||
if (TREE_CODE ($$) == SCOPE_REF
|
||||
&& (TREE_CODE (TREE_OPERAND ($$, 0)) == TEMPLATE_TYPE_PARM
|
||||
|| TREE_CODE (TREE_OPERAND ($$, 0)) == BOUND_TEMPLATE_TEMPLATE_PARM))
|
||||
error (" perhaps you want `typename %E' to make it a type", $$);
|
||||
if (TREE_CODE ($$) == SCOPE_REF)
|
||||
{
|
||||
if (TREE_CODE (TREE_OPERAND ($$, 0)) == TEMPLATE_TYPE_PARM
|
||||
|| TREE_CODE (TREE_OPERAND ($$, 0)) == BOUND_TEMPLATE_TEMPLATE_PARM)
|
||||
error ("`%E' is not a type, use `typename %E' to make it one", $$);
|
||||
else
|
||||
error ("no type `%D' in `%T'", TREE_OPERAND ($$, 1), TREE_OPERAND ($$, 0));
|
||||
}
|
||||
else
|
||||
error ("type specifier omitted for parameter `%E'", $$);
|
||||
$$ = build_tree_list (integer_type_node, $$);
|
||||
}
|
||||
;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2001-12-26 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* g++.dg/eh/ctor1.C: New test.
|
||||
* g++.dg/other/error2.C: New test.
|
||||
|
||||
2001-12-24 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* g++.dg/other/init2.C: New test.
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
// { dg-do run }
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com>
|
||||
|
||||
// PR 411
|
||||
|
||||
bool was_f_in_Bar_destroyed=false;
|
||||
|
||||
struct Foo
|
||||
{
|
||||
~Foo()
|
||||
{
|
||||
was_f_in_Bar_destroyed=true;
|
||||
}
|
||||
};
|
||||
|
||||
struct Bar
|
||||
{
|
||||
~Bar()
|
||||
{
|
||||
throw 1;
|
||||
}
|
||||
|
||||
Foo f;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
try
|
||||
{
|
||||
Bar f;
|
||||
}
|
||||
catch(int i)
|
||||
{
|
||||
if(was_f_in_Bar_destroyed)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
// { dg-do compile }
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com>
|
||||
|
||||
// PR 196. Misleading diagnostic
|
||||
|
||||
namespace N
|
||||
{
|
||||
class B { friend void operator>>(int, class B); };
|
||||
class N { friend void operator>>(int,class N); };
|
||||
}
|
||||
void N::operator>>(int, N::B) // { dg-error "no type `B' in `N::N'" "" }
|
||||
{ } // { dg-error "" "" }
|
Loading…
Reference in New Issue