diff options
author | Mark Mitchell <mark@codesourcery.com> | 2002-04-13 07:10:12 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2002-04-13 07:10:12 +0000 |
commit | 0481bc2173f4356508e3eed62575fa36b22dfefb (patch) | |
tree | 3c8faed6a9f50ee59d2f66d5398cf53616345600 /gcc | |
parent | 1d405c5eba2b1350d2614e690e35fbb0076209f4 (diff) | |
download | gcc-0481bc2173f4356508e3eed62575fa36b22dfefb.zip gcc-0481bc2173f4356508e3eed62575fa36b22dfefb.tar.gz gcc-0481bc2173f4356508e3eed62575fa36b22dfefb.tar.bz2 |
re PR c++/5373 (Statement expressions broken in C++)
PR c++ 5373.
* g++.dg/parse/stmtexpr1.C: New test.
PR c++/5373.
* semantics.c (finish_expr_stmt): Remember the type of the
expression before any conversions are performed.
From-SVN: r52264
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/stmtexpr1.C | 9 |
4 files changed, 24 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ca9251a..e615310 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2002-04-12 Mark Mitchell <mark@codesourcery.com> + PR c++/5373. + * semantics.c (finish_expr_stmt): Remember the type of the + expression before any conversions are performed. + +2002-04-12 Mark Mitchell <mark@codesourcery.com> + PR c++/5189. * call.c (add_template_candidate_real): Do not treat member templates as copy constructors. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index fb6e182..f53ac28 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -203,6 +203,7 @@ finish_expr_stmt (expr) tree expr; { tree r = NULL_TREE; + tree expr_type = NULL_TREE;; if (expr != NULL_TREE) { @@ -213,6 +214,9 @@ finish_expr_stmt (expr) || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)) expr = default_conversion (expr); + /* Remember the type of the expression. */ + expr_type = TREE_TYPE (expr); + if (stmts_are_full_exprs_p ()) expr = convert_to_void (expr, "statement"); @@ -223,7 +227,7 @@ finish_expr_stmt (expr) /* This was an expression-statement, so we save the type of the expression. */ - last_expr_type = expr ? TREE_TYPE (expr) : NULL_TREE; + last_expr_type = expr_type; return r; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b04b99b..d3391f0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,8 +1,10 @@ 2002-04-12 Mark Mitchell <mark@codesourcery.com> + PR c++ 5373. + * g++.dg/parse/stmtexpr1.C: New test. + PR c++/5189. - * call.c (add_template_candidate_real): Do not treat member - templates as copy constructors. + * g++.dg/template/copy1.C: New test. 2002-04-12 Richard Henderson <rth@redhat.com> diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr1.C b/gcc/testsuite/g++.dg/parse/stmtexpr1.C new file mode 100644 index 0000000..4455398 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stmtexpr1.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "" } + +int +main (int argc, char **argv) +{ + int a = ({ 1 ? 0 : 1; }); + return ({ argc > 1 ? 1 : 0; }); +} |