diff options
author | Mark Mitchell <mark@codesourcery.com> | 2003-10-22 02:08:47 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-10-22 02:08:47 +0000 |
commit | 18fd68a8b39900352967c54496fc1b394e7c48f2 (patch) | |
tree | 43df86f21401b1fb9baf02d37d1b647fbbf75cc7 /gcc | |
parent | 4f52529432143a89cbbf6344de2758b9a7d443f2 (diff) | |
download | gcc-18fd68a8b39900352967c54496fc1b394e7c48f2.zip gcc-18fd68a8b39900352967c54496fc1b394e7c48f2.tar.gz gcc-18fd68a8b39900352967c54496fc1b394e7c48f2.tar.bz2 |
re PR c++/11962 (ICE in type_dependent_expression on omitted second operand to ?: in template argument expression)
PR c++/11962
* typeck.c (build_x_conditional_expr): Handle missing middle
operands in templates.
* mangle.c (write_expression): Issue errors about attempts to
mangle a non-existant middle operator to the ?: operator.
PR c++/11962
* g++.dg/template/cond2.C: New test.
From-SVN: r72785
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 16 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/cond2.C | 10 |
5 files changed, 42 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index df0297a..ba2ee1a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2003-10-21 Mark Mitchell <mark@codesourcery.com> + + PR c++/11962 + * typeck.c (build_x_conditional_expr): Handle missing middle + operands in templates. + * mangle.c (write_expression): Issue errors about attempts to + mangle a non-existant middle operator to the ?: operator. + 2003-10-21 Robert Bowdidge <bowdidge@apple.com> * decl.c (cp_finish_decl): Remove clause intended for asm directives in struct or class fields: this code is never executed. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index c8b3a84..15334f3 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -2041,7 +2041,21 @@ write_expression (tree expr) default: for (i = 0; i < TREE_CODE_LENGTH (code); ++i) - write_expression (TREE_OPERAND (expr, i)); + { + tree operand = TREE_OPERAND (expr, i); + /* As a GNU expression, the middle operand of a + conditional may be omitted. Since expression + manglings are supposed to represent the input token + stream, there's no good way to mangle such an + expression without extending the C++ ABI. */ + if (code == COND_EXPR && i == 1 && !operand) + { + error ("omitted middle operand to `?:' operand " + "cannot be mangled"); + continue; + } + write_expression (operand); + } } } } diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index f211151..e469a5a 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4284,11 +4284,13 @@ build_x_conditional_expr (tree ifexp, tree op1, tree op2) IFEXP is type-dependent, even though the eventual type of the expression doesn't dependent on IFEXP. */ if (type_dependent_expression_p (ifexp) - || type_dependent_expression_p (op1) + /* As a GNU extension, the middle operand may be omitted. */ + || (op1 && type_dependent_expression_p (op1)) || type_dependent_expression_p (op2)) return build_min_nt (COND_EXPR, ifexp, op1, op2); ifexp = build_non_dependent_expr (ifexp); - op1 = build_non_dependent_expr (op1); + if (op1) + op1 = build_non_dependent_expr (op1); op2 = build_non_dependent_expr (op2); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a4509eb..5153e07 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-10-21 Mark Mitchell <mark@codesourcery.com> + + PR c++/11962 + * g++.dg/template/cond2.C: New test. + 2003-10-20 Joseph S. Myers <jsm@polyomino.org.uk> * gcc.dg/builtins-28.c: New test. diff --git a/gcc/testsuite/g++.dg/template/cond2.C b/gcc/testsuite/g++.dg/template/cond2.C new file mode 100644 index 0000000..abb6ebb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cond2.C @@ -0,0 +1,10 @@ +// PR c++/11962 +// { dg-options "" } + +template<int X> class c; + +template<int X, int Y> int test(c<X ? : Y>&); + +void test(c<2>*c2) { + test<0, 2>(*c2); // { dg-error "omitted" } +} |