aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>1999-06-04 01:31:42 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>1999-06-04 01:31:42 +0000
commit980c394cc794bc96e13ebcaa756573f3bd729681 (patch)
treebcbad958465b29e18aa00a18d2b03df521b66066 /gcc
parent4469640cbdb360e7ab33b3b49b892160951557c8 (diff)
downloadgcc-980c394cc794bc96e13ebcaa756573f3bd729681.zip
gcc-980c394cc794bc96e13ebcaa756573f3bd729681.tar.gz
gcc-980c394cc794bc96e13ebcaa756573f3bd729681.tar.bz2
* except.c (build_throw): Check throw expression validity.
From-SVN: r27344
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/except.c24
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/ice990323-1.C6
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/ice990323-2.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/ice990323-3.C3
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/ice990323-4.C3
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/ice990323-5.C3
8 files changed, 40 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b7f4289..d59db6b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index 9e2d6af59..5bdbd8c 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -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;
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C
index 9bf8a09..ef6d2dc 100644
--- a/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/eh990323-1.C
@@ -17,7 +17,7 @@ template <class T> void ff(T)
{
}
-void g(void)
+void g(int)
{
}
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-1.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-1.C
index c03154b..06112d2 100644
--- a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-1.C
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-1.C
@@ -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
}
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-2.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-2.C
index 3fa5bd5..0686ee5 100644
--- a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-2.C
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-2.C
@@ -25,7 +25,7 @@ void f4()
throw A<double, 47, A<int, 36, short> > ("hi michey");
}
-main()
+int main()
{
int flag;
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-3.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-3.C
index 55cb16c..842e647 100644
--- a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-3.C
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-3.C
@@ -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
}
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-4.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-4.C
index 85bbb45..7f3f20e 100644
--- a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-4.C
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-4.C
@@ -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
}
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-5.C b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-5.C
index c49b66e..45225e3 100644
--- a/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-5.C
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/ice990323-5.C
@@ -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
}