Commit 47d4c811 by Nathan Sidwell Committed by Nathan Sidwell

re PR c++/11945 (Incorrect warnings issued for comma-expressions inside templates)

cp:
	PR c++/11945
	* pt.c (build_non_dependent_expr): Look inside COND_EXPR and
	COMPOUND_EXPR.
	* semantics.c (finish_expr_stmt): Always convert to void.
	* typeck.c (build_x_compound_exp): Always convert to void.
testsuite:
	PR c++/11945
	* g++.dg/warn/noeffect2.C: New test.

From-SVN: r70606
parent f2f3f409
2003-08-20 Nathan Sidwell <nathan@codesourcery.com>
PR c++/11945
* pt.c (build_non_dependent_expr): Look inside COND_EXPR and
COMPOUND_EXPR.
* semantics.c (finish_expr_stmt): Always convert to void.
* typeck.c (build_x_compound_exp): Always convert to void.
2003-08-19 Mark Mitchell <mark@codesourcery.com>
PR c++/11684
......
......@@ -11797,6 +11797,19 @@ build_non_dependent_expr (tree expr)
types. */
if (TREE_CODE (expr) == OVERLOAD)
return expr;
if (TREE_CODE (expr) == COND_EXPR)
return build (COND_EXPR,
TREE_TYPE (expr),
TREE_OPERAND (expr, 0),
build_non_dependent_expr (TREE_OPERAND (expr, 1)),
build_non_dependent_expr (TREE_OPERAND (expr, 2)));
if (TREE_CODE (expr) == COMPOUND_EXPR)
return build (COMPOUND_EXPR,
TREE_TYPE (expr),
TREE_OPERAND (expr, 0),
build_non_dependent_expr (TREE_OPERAND (expr, 1)));
/* Otherwise, build a NON_DEPENDENT_EXPR.
REFERENCE_TYPEs are not stripped for expressions in templates
......
......@@ -421,6 +421,8 @@ finish_expr_stmt (tree expr)
{
if (!processing_template_decl)
expr = convert_to_void (expr, "statement");
else if (!type_dependent_expression_p (expr))
convert_to_void (build_non_dependent_expr (expr), "statement");
r = add_stmt (build_stmt (EXPR_STMT, expr));
}
......
......@@ -4309,11 +4309,8 @@ build_x_compound_expr (tree op1, tree op2)
tree
build_compound_expr (tree lhs, tree rhs)
{
if (!processing_template_decl)
{
lhs = decl_constant_value (lhs);
lhs = convert_to_void (lhs, "left-hand operand of comma");
}
lhs = decl_constant_value (lhs);
lhs = convert_to_void (lhs, "left-hand operand of comma");
if (lhs == error_mark_node || rhs == error_mark_node)
return error_mark_node;
......
2003-08-20 Nathan Sidwell <nathan@codesourcery.com>
PR c++/11945
* g++.dg/warn/noeffect2.C: New test.
2003-08-19 Mark Mitchell <mark@codesourcery.com>
PR c++/10926
......@@ -54,6 +59,9 @@
2003-08-18 Nathan Sidwell <nathan@codesourcery.com>
PR c++/11957
* g++.dg/warn/noeffect1.C: New test.
* g++.dg/template/scope2.C: New test.
* g++.dg/template/error2.C: Correct dg-error
......
// { dg-do compile }
// { dg-options "-Wall" }
// Copyright (C) 2003 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 18 Aug 2003 <nathan@codesourcery.com>
// Origin PR 11945 gerald@pfeifer.com
// PR 11945 inconsistent warnings
extern "C" void FormatDisk();
template <class T>
struct C {
C(){ FormatDisk(), 0; } // { dg-warning "right-hand operand of comma" "" }
};
template <class T>
void f() { FormatDisk(), 0; } // { dg-warning "right-hand operand of comma" "" }
void g() { FormatDisk(), 0; } // { dg-warning "right-hand operand of comma" "" }
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