* except.c (build_throw): Check throw expression validity.
From-SVN: r27344
This commit is contained in:
parent
4469640cbd
commit
980c394cc7
|
@ -1,3 +1,7 @@
|
|||
1999-06-04 Nathan Sidwell <nathan@acm.org>
|
||||
|
||||
* except.c (build_throw): Check throw expression validity.
|
||||
|
||||
1999-06-03 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* decl.c (grokdeclarator): Don't treat arbitrary types as unsigned
|
||||
|
|
|
@ -1152,6 +1152,30 @@ build_throw (e)
|
|||
|
||||
if (e == null_node)
|
||||
cp_warning ("throwing NULL, which has integral, not pointer type");
|
||||
|
||||
if (e != NULL_TREE)
|
||||
{
|
||||
tree core;
|
||||
int is_ptr;
|
||||
|
||||
/* Cannot throw an incomplete type. */
|
||||
e = require_complete_type (e);
|
||||
if (e == error_mark_node)
|
||||
return e;
|
||||
|
||||
/* Or a pointer or ref to one, other than cv void *. */
|
||||
core = TREE_TYPE (e);
|
||||
is_ptr = TREE_CODE (core) == POINTER_TYPE;
|
||||
if (is_ptr || TREE_CODE (core) == REFERENCE_TYPE)
|
||||
{
|
||||
core = TREE_TYPE (core);
|
||||
|
||||
if (is_ptr && same_type_p (TYPE_MAIN_VARIANT (core), void_type_node))
|
||||
/* OK */;
|
||||
else if (!complete_type_or_else (core, NULL_TREE))
|
||||
return error_mark_node;
|
||||
}
|
||||
}
|
||||
|
||||
e = build1 (THROW_EXPR, void_type_node, e);
|
||||
TREE_SIDE_EFFECTS (e) = 1;
|
||||
|
|
|
@ -17,7 +17,7 @@ template <class T> void ff(T)
|
|||
{
|
||||
}
|
||||
|
||||
void g(void)
|
||||
void g(int)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
// Build don't link:
|
||||
|
||||
//test 2
|
||||
struct A {};
|
||||
void f()
|
||||
{
|
||||
struct A;
|
||||
throw *(new A);
|
||||
struct A; // ERROR - forward ref
|
||||
throw *(new A); // ERROR - invalid use of undefined type
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ void f4()
|
|||
throw A<double, 47, A<int, 36, short> > ("hi michey");
|
||||
}
|
||||
|
||||
main()
|
||||
int main()
|
||||
{
|
||||
int flag;
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// Build don't link:
|
||||
// try throwing overloaded function
|
||||
|
||||
void f(int)
|
||||
|
@ -10,5 +11,5 @@ void f(long)
|
|||
|
||||
void g()
|
||||
{
|
||||
throw &f;
|
||||
throw &f; // ERROR - insufficient contextual information
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// Build don't link:
|
||||
// try throwing template function name
|
||||
|
||||
template <class T> void f(T);
|
||||
|
@ -8,5 +9,5 @@ template <class T> void f(T)
|
|||
|
||||
void g()
|
||||
{
|
||||
throw &f;
|
||||
throw &f; // ERROR - insufficient contextual information
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// Build don't link:
|
||||
// check attempting to throw an overloaded function
|
||||
|
||||
struct A {
|
||||
|
@ -7,5 +8,5 @@ struct A {
|
|||
|
||||
void g()
|
||||
{
|
||||
throw &A::f;
|
||||
throw &A::f; // ERROR - insufficient context
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue