* except.c (build_throw): Check throw expression validity.

From-SVN: r27344
This commit is contained in:
Nathan Sidwell 1999-06-04 01:31:42 +00:00 committed by Nathan Sidwell
parent 4469640cbd
commit 980c394cc7
8 changed files with 40 additions and 7 deletions

View File

@ -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

View File

@ -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;

View File

@ -17,7 +17,7 @@ template <class T> void ff(T)
{
}
void g(void)
void g(int)
{
}

View File

@ -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
}

View File

@ -25,7 +25,7 @@ void f4()
throw A<double, 47, A<int, 36, short> > ("hi michey");
}
main()
int main()
{
int flag;

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}