Commit 980c394c by Nathan Sidwell Committed by Nathan Sidwell

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

From-SVN: r27344
parent 4469640c
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)
{
}
......
// 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;
......
// 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
}
// 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
}
// 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
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment