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> 1999-06-03 Mark Mitchell <mark@codesourcery.com>
* decl.c (grokdeclarator): Don't treat arbitrary types as unsigned * decl.c (grokdeclarator): Don't treat arbitrary types as unsigned
......
...@@ -1153,6 +1153,30 @@ build_throw (e) ...@@ -1153,6 +1153,30 @@ build_throw (e)
if (e == null_node) if (e == null_node)
cp_warning ("throwing NULL, which has integral, not pointer type"); 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); e = build1 (THROW_EXPR, void_type_node, e);
TREE_SIDE_EFFECTS (e) = 1; TREE_SIDE_EFFECTS (e) = 1;
TREE_USED (e) = 1; TREE_USED (e) = 1;
......
...@@ -17,7 +17,7 @@ template <class T> void ff(T) ...@@ -17,7 +17,7 @@ template <class T> void ff(T)
{ {
} }
void g(void) void g(int)
{ {
} }
......
// Build don't link:
//test 2 //test 2
struct A {}; struct A {};
void f() void f()
{ {
struct A; struct A; // ERROR - forward ref
throw *(new A); throw *(new A); // ERROR - invalid use of undefined type
} }
...@@ -25,7 +25,7 @@ void f4() ...@@ -25,7 +25,7 @@ void f4()
throw A<double, 47, A<int, 36, short> > ("hi michey"); throw A<double, 47, A<int, 36, short> > ("hi michey");
} }
main() int main()
{ {
int flag; int flag;
......
// Build don't link:
// try throwing overloaded function // try throwing overloaded function
void f(int) void f(int)
...@@ -10,5 +11,5 @@ void f(long) ...@@ -10,5 +11,5 @@ void f(long)
void g() void g()
{ {
throw &f; throw &f; // ERROR - insufficient contextual information
} }
// Build don't link:
// try throwing template function name // try throwing template function name
template <class T> void f(T); template <class T> void f(T);
...@@ -8,5 +9,5 @@ template <class T> void f(T) ...@@ -8,5 +9,5 @@ template <class T> void f(T)
void g() void g()
{ {
throw &f; throw &f; // ERROR - insufficient contextual information
} }
// Build don't link:
// check attempting to throw an overloaded function // check attempting to throw an overloaded function
struct A { struct A {
...@@ -7,5 +8,5 @@ struct A { ...@@ -7,5 +8,5 @@ struct A {
void g() 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