Bug 5675 - const variables wrongly considered part of constant expressions (gcc.dg/c9[09]-const-expr-3.c)
Summary: const variables wrongly considered part of constant expressions (gcc.dg/c9[09...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 3.1
: P3 normal
Target Milestone: 4.5.0
Assignee: Joseph S. Myers
URL:
Keywords: accepts-invalid
Depends on:
Blocks: 16989 16620
  Show dependency treegraph
 
Reported: 2002-02-12 13:46 UTC by Joseph S. Myers
Modified: 2009-03-29 18:18 UTC (History)
3 users (show)

See Also:
Host: *-*-*
Target: *-*-*
Build: *-*-*
Known to work:
Known to fail: 3.4.0
Last reconfirmed: 2008-10-24 00:06:40


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Joseph S. Myers 2002-02-12 13:46:02 UTC
In some circumstances, GCC wrongly accepts const variables as part of
constant expressions when compiling C.

Release:
3.1 20020212 (experimental)

Environment:
System: Linux digraph 2.2.20 #2 Sat Nov 10 16:44:22 UTC 2001 i686 unknown
Architecture: i686

	
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: ../gcc-cvs/configure --prefix=/opt/gcc/mainline --disable-shared --enable-threads=posix --with-system-zlib

How-To-Repeat:

The XFAILing tests in gcc.dg/c9[09]-const-expr-3.c.
Comment 1 Joseph S. Myers 2002-02-12 13:46:02 UTC
Fix:

Fixing the underlying problems associated with
decl_constant_value_for_broken_optimization, moving such optimizations
until after all constraint checking, might help.  Or keep proper track
for every subexpression of whether it is a constant expression (see
also c/456).
Comment 2 Dara Hazeghi 2003-05-27 05:09:22 UTC
Hello,

This bug is confirmed to still exist on gcc 3.3 branch and mainline (20030525).

Dara
Comment 3 Andrew Pinski 2003-05-27 14:38:12 UTC
See Dara's comment.
Comment 4 Joseph S. Myers 2004-08-11 20:50:44 UTC
Semi-formal model of constant expressions proposed for discussion:
http://gcc.gnu.org/ml/gcc/2004-08/msg00377.html
(with informal documentation of the extensions in GNU C).

Note that some cases additional to those failing when this bug was reported
started failing around 24 March.

http://gcc.gnu.org/ml/gcc-regression/2004-03/msg00022.html
Comment 5 Geoff Keating 2004-10-25 02:21:16 UTC
GCC is now more consistent about when this bug triggers, so some cases which passed in 3.4 fail in 
4.0.

There are testcases for this bug, gcc.dg/c90-const-expr-3.c and gcc.dg/c99-const-expr-3.c.
Comment 6 Ian Lance Taylor 2005-01-13 02:34:02 UTC
Just a note that reverting this patch:
    http://gcc.gnu.org/ml/gcc-patches/2003-02/msg01334.html
fixes this regression.  Reverting that patch

Jan said that his patch did not change the results of the test, so presumably
something else changed somewhere.

Reverting that patch removes most of the warnings from c90-const-expr-3.c and
c99-const-expr-3.c, although we still get warnings for +0.0, 0.0+0.0, and
(double)0.0.
Comment 7 Ian Lance Taylor 2005-01-13 15:16:44 UTC
Partial patch: http://gcc.gnu.org/ml/gcc-patches/2005-01/msg00725.html
Comment 8 CVS Commits 2005-01-17 18:54:32 UTC
Subject: Bug 5675

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	ian@gcc.gnu.org	2005-01-17 18:54:21

Modified files:
	gcc            : ChangeLog c-typeck.c 

Log message:
	PR c/5675
	* c-typeck.c (build_c_cast): Revert patch of 2003-02-16: don't
	fold constant variables into initial values.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.7155&r2=2.7156
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-typeck.c.diff?cvsroot=gcc&r1=1.407&r2=1.408

Comment 9 CVS Commits 2005-01-17 18:56:02 UTC
Subject: Bug 5675

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	ian@gcc.gnu.org	2005-01-17 18:55:57

Modified files:
	gcc/testsuite  : ChangeLog 
	gcc/testsuite/gcc.dg: c90-const-expr-3.c c99-const-expr-3.c 

Log message:
	PR c/5675
	* gcc.dg/c90-const-expr-3.c: Remove xfails on tests which now
	pass--those that refer just to the variable, possibly with a
	cast.
	* gcc.dg/c99-const-expr-3.c: Likewise.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.4897&r2=1.4898
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/c90-const-expr-3.c.diff?cvsroot=gcc&r1=1.5&r2=1.6
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/c99-const-expr-3.c.diff?cvsroot=gcc&r1=1.4&r2=1.5

Comment 10 Ian Lance Taylor 2005-01-17 18:57:33 UTC
This bug is not fixed, but the 4.0 regression has been fixed.  4.0 now fails in
the same way as earlier gcc versions.
Comment 11 Andrew Pinski 2005-06-30 13:31:33 UTC
Adding "gcc.dg/c9[09]-const-expr-3.c" to the summary so I don't get confused between this bug and 
PR 456.
Comment 12 Joseph S. Myers 2008-10-24 00:06:40 UTC
Testing a patch for 4.5.
Comment 13 Joseph S. Myers 2008-10-24 19:36:37 UTC
Subject: Bug 5675

Author: jsm28
Date: Fri Oct 24 19:34:52 2008
New Revision: 141349

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=141349
Log:
	PR c/456
	PR c/5675
	PR c/19976
	PR c/29116
	PR c/31871
	PR c/35198

fixincludes:
	* inclhack.def (glibc_tgmath): New fix.
	* fixincl.x: Regenerate.
	* tests/base/tgmath.h: New.

gcc:
	* builtins.c (fold_call_expr): Return a NOP_EXPR from folding
	rather than the contained expression.
	* c-common.c (c_save_expr): New.
	(c_common_truthvalue_conversion): Use c_save_expr.  Do not fold
	conditional expressions for C.
	* c-common.def (C_MAYBE_CONST_EXPR): New.
	* c-common.h (c_fully_fold, c_save_expr): New prototypes.
	(C_MAYBE_CONST_EXPR_PRE, C_MAYBE_CONST_EXPR_EXPR,
	C_MAYBE_CONST_EXPR_INT_OPERANDS, C_MAYBE_CONST_EXPR_NON_CONST,
	EXPR_INT_CONST_OPERANDS): Define.
	* c-convert.c (convert): Strip nops from expression.
	* c-decl.c (groktypename): Take extra parameters expr and
	expr_const_operands.  Update call to grokdeclarator.
	(start_decl): Update call to grokdeclarator.  Add statement for
	expressions used in type of decl.
	(grokparm): Update call to grokdeclarator.
	(push_parm_decl): Update call to grokdeclarator.
	(build_compound_literal): Add parameter non_const and build a
	C_MAYBE_COSNT_EXPR if applicable.
	(grokdeclarator): Take extra parameters expr and
	expr_const_operands.  Track expressions used in declaration
	specifiers and declarators.  Fold array sizes and track whether
	they are constant expressions and whether they are integer
	constant expressions.
	(parser_xref_tag): Set expr and expr_const_operands fields in
	return value.
	(grokfield): Update call to grokdeclarator.
	(start_function): Update call to grokdeclarator.
	(build_null_declspecs): Set expr and expr_const_operands fields in
	return value.
	(declspecs_add_type): Handle expressions in typeof specifiers.
	* c-parser.c (c_parser_declspecs): Set expr and
	expr_const_operands fields for declaration specifiers.
	(c_parser_enum_specifier): Likewise.
	(c_parser_struct_or_union_specifier): Likewise.
	(c_parser_typeof_specifier): Likewise.  Update call to
	groktypename.  Fold expression as needed.  Return expressions with
	type instead of adding statements.
	(c_parser_attributes): Update calls to c_parser_expr_list.
	(c_parser_statement_after_labels): Fold expression before passing
	to objc_build_throw_stmt.
	(c_parser_condition): Fold expression.
	(c_parser_asm_operands): Fold expression.
	(c_parser_conditional_expression): Use c_save_expr.  Update call
	to build_conditional_expr.
	(c_parser_alignof_expression): Update call to groktypename.
	(c_parser_postfix_expression): Preserve C_MAYBE_CONST_EXPR as
	original_code.  Fold expression argument of va_arg.  Create
	C_MAYBE_CONST_EXPR to preserve side effects of expressions in type
	argument to va_arg.  Update calls to groktypename.  Fold array
	index for offsetof.  Verify that first argument to
	__builtin_choose_expr has integer type.
	(c_parser_postfix_expression_after_paren_type): Update calls to
	groktypename and build_compound_literal.  Handle expressions with
	side effects in type name.
	(c_parser_postfix_expression_after_primary): Update call to
	c_parser_expr_list.  Set original_code for calls to
	__builtin_constant_p.
	(c_parser_expr_list): Take extra parameter fold_p.  Fold
	expressions if requested.
	(c_parser_objc_type_name): Update call to groktypename.
	(c_parser_objc_synchronized_statement): Fold expression.
	(c_parser_objc_receiver): Fold expression.
	(c_parser_objc_keywordexpr): Update call to c_parser_expr_list.
	(c_parser_omp_clause_num_threads, c_parser_omp_clause_schedule,
	c_parser_omp_atomic, c_parser_omp_for_loop): Fold expressions.
	* c-tree.h (CONSTRUCTOR_NON_CONST): Define.
	(struct c_typespec): Add elements expr and expr_const_operands.
	(struct c_declspecs): Add elements expr and expr_const_operands.
	(groktypename, build_conditional_expr, build_compound_literal):
	Update prototypes.
	* c-typeck.c (c_fully_fold, c_fully_fold_internal,
	note_integer_operands): New functions.
	(decl_constant_value_for_broken_optimization): Rename to
	decl_constant_value_for_optimization:  Check whether optimizing
	and that the expression is a VAR_DECL not of array type instead of
	doing such checks in the caller.  Do not check pedantic.
	(default_function_array_conversion): Do not strip nops.
	(default_conversion): Do not call
	decl_constant_value_for_broken_optimization.
	(build_array_ref): Do not fold result.
	(c_expr_sizeof_expr): Fold operand.  Use C_MAYBE_CONST_EXPR for
	result when operand is a VLA.
	(c_expr_sizeof_type): Update call to groktypename.  Handle
	expressions included in type name.  Use C_MAYBE_CONST_EXPR for
	result when operand names a VLA type.
	(build_function_call): Update call to build_compound_literal.
	Only fold result for calls to __builtin_* functions.  Strip
	NOP_EXPR from INTEGER_CST returned from such functions.
	(convert_arguments): Fold arguments.  Update call to
	convert_for_assignment.
	(build_unary_op): Handle increment and decrement of
	C_MAYBE_CONST_EXPR.  Move lvalue checks for increment and
	decrement earlier.  Fold operand of increment and decrement.
	Handle address of C_MAYBE_CONST_EXPR.  Only fold expression being
	built for integer operand.  Wrap returns that are INTEGER_CSTs
	without being integer constant expressions or that have integer
	constant operands without being INTEGER_CSTs.
	(lvalue_p): Handle C_MAYBE_CONST_EXPR.
	(build_conditional_expr): Add operand ifexp_bcp.  Track whether
	result is an integer constant expression or can be used in
	unevaluated parts of one and avoid folding and wrap as
	appropriate.
	(build_compound_expr): Wrap result for C99 if operands can be used
	in integer constant expressions.
	(build_c_cast): Update call to digest_init.  Do not ignore
	overflow from casting floating-point constants to integers.  Wrap
	results that could be confused with integer constant expressions,
	null pointer constants or floating-point constants.
	(c_cast_expr): Update call to groktypename.  Handle expressions
	included in type name.
	(build_modify_expr): Handle modifying a C_MAYBE_CONST_EXPR.  Fold
	lhs inside possible SAVE_EXPR.  Fold RHS before assignment.
	Update calls to convert_for_assignment.
	(convert_for_assignment): Take new parameter
	null_pointer_constant.  Do not strip nops or call
	decl_constant_value_for_broken_optimization.
	(store_init_value): Update call to digest_init.
	(digest_init): Take new parameter null_pointer_constant.  Do not
	call decl_constant_value_for_broken_optimization.  pedwarn for
	initializers not constant expressions.  Update calls to
	convert_for_assignment.
	(constructor_nonconst): New.
	(struct constructor_stack): Add nonconst element.
	(really_start_incremental_init, push_init_level, pop_init_level):
	Handle constructor_nonconst and nonconst element.
	(set_init_index): Call constant_expression_warning for array
	designators.
	(output_init_element): Fold value.  Set constructor_nonconst as
	applicable.  pedwarn for initializers not constant expressions.
	Update call to digest_init.  Call constant_expression_warning
	where constant initializers are required.
	(process_init_element): Use c_save_expr.
	(c_finish_goto_ptr): Fold expression.
	(c_finish_return): Fold return value.  Update call to
	convert_for_assignment.
	(c_start_case): Fold switch expression.
	(c_process_expr_stmt): Fold expression.
	(c_finish_stmt_expr): Create C_MAYBE_CONST_EXPR as needed to
	ensure statement expression is not evaluated in constant
	expression.
	(build_binary_op): Track whether results are integer constant
	expressions or may occur in such, disable folding and wrap results
	as applicable.
	(c_objc_common_truthvalue_conversion): Handle results folded to
	integer constants that are not integer constant expressions.
	* doc/extend.texi: Document when typeof operands are evaluated,
	that condition of __builtin_choose_expr is an integer constant
	expression, and more about use of __builtin_constant_p in
	initializers.

gcc/cp:
	* typeck.c (c_fully_fold): New.

gcc/testsuite:
	* gcc.dg/bconstp-2.c, gcc.dg/c90-const-expr-6.c,
	gcc.dg/c90-const-expr-7.c, gcc.dg/c90-const-expr-8.c,
	gcc.dg/c90-const-expr-9.c, gcc.dg/c90-const-expr-10.c,
	gcc.dg/c90-const-expr-11.c, gcc.dg/c99-const-expr-6.c,
	gcc.dg/c99-const-expr-7.c, gcc.dg/c99-const-expr-8.c,
	gcc.dg/c99-const-expr-9.c, gcc.dg/c99-const-expr-10.c,
	gcc.dg/c99-const-expr-11.c, gcc.dg/c99-const-expr-12.c,
	gcc.dg/c99-const-expr-13.c, gcc.dg/gnu89-const-expr-1.c,
	gcc.dg/gnu89-const-expr-2.c, gcc.dg/gnu99-const-expr-1.c,
	gcc.dg/gnu99-const-expr-2.c, gcc.dg/gnu99-const-expr-3.c,
	gcc.dg/vla-11.c, gcc.dg/vla-12.c, gcc.dg/vla-13.c,
	gcc.dg/vla-14.c, gcc.dg/vla-15.c: New tests.
	* gcc.dg/c90-const-expr-1.c, gcc.dg/c90-const-expr-2.c,
	gcc.dg/c90-const-expr-3.c, gcc.dg/c99-const-expr-2.c,
	gcc.dg/c99-const-expr-3.c, gcc.dg/c99-static-1.c: Remove XFAILs.
	* gcc.dg/overflow-warn-1.c, gcc.dg/overflow-warn-2.c,
	gcc.dg/overflow-warn-3.c, gcc.dg/overflow-warn-4.c: Remove
	XFAILs.  Update expected messages.
	* gcc.dg/pr14649-1.c, gcc.dg/pr19984.c, gcc.dg/pr25682.c: Update
	expected messages.
	* gcc.dg/real-const-1.c: Replace with test from original PR.

Added:
    branches/c-4_5-branch/fixincludes/ChangeLog.c45
    branches/c-4_5-branch/fixincludes/tests/base/tgmath.h
    branches/c-4_5-branch/gcc/ChangeLog.c45
    branches/c-4_5-branch/gcc/cp/ChangeLog.c45
    branches/c-4_5-branch/gcc/testsuite/ChangeLog.c45
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/bconstp-2.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c90-const-expr-10.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c90-const-expr-11.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c90-const-expr-6.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c90-const-expr-7.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c90-const-expr-8.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c90-const-expr-9.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-10.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-11.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-12.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-13.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-6.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-7.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-8.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-9.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/gnu89-const-expr-1.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/gnu89-const-expr-2.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/gnu99-const-expr-1.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/gnu99-const-expr-2.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/gnu99-const-expr-3.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/vla-11.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/vla-12.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/vla-13.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/vla-14.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/vla-15.c
Modified:
    branches/c-4_5-branch/fixincludes/fixincl.x
    branches/c-4_5-branch/fixincludes/inclhack.def
    branches/c-4_5-branch/gcc/builtins.c
    branches/c-4_5-branch/gcc/c-common.c
    branches/c-4_5-branch/gcc/c-common.def
    branches/c-4_5-branch/gcc/c-common.h
    branches/c-4_5-branch/gcc/c-convert.c
    branches/c-4_5-branch/gcc/c-decl.c
    branches/c-4_5-branch/gcc/c-parser.c
    branches/c-4_5-branch/gcc/c-tree.h
    branches/c-4_5-branch/gcc/c-typeck.c
    branches/c-4_5-branch/gcc/cp/typeck.c
    branches/c-4_5-branch/gcc/doc/extend.texi
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c90-const-expr-1.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c90-const-expr-2.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c90-const-expr-3.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-2.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-const-expr-3.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/c99-static-1.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/overflow-warn-1.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/overflow-warn-2.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/overflow-warn-3.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/overflow-warn-4.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/pr14649-1.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/pr19984.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/pr25682.c
    branches/c-4_5-branch/gcc/testsuite/gcc.dg/real-const-1.c

Comment 14 Joseph S. Myers 2009-03-29 18:14:18 UTC
Subject: Bug 5675

Author: jsm28
Date: Sun Mar 29 18:13:43 2009
New Revision: 145254

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=145254
Log:
	PR c/456
	PR c/5675
	PR c/19976
	PR c/29116
	PR c/31871
	PR c/35198

fixincludes:
	* inclhack.def (glibc_tgmath): New fix.
	* fixincl.x: Regenerate.
	* tests/base/tgmath.h: New.

gcc:
	* builtins.c (fold_builtin_sincos): Build COMPOUND_EXPR in
	void_type_node.
	(fold_call_expr): Return a NOP_EXPR from folding rather than the
	contained expression.
	* c-common.c (c_fully_fold, c_fully_fold_internal, c_save_expr):
	New.
	(c_common_truthvalue_conversion): Use c_save_expr.  Do not fold
	conditional expressions for C.
	(decl_constant_value_for_optimization): Move from
	decl_constant_value_for_broken_optimization in c-typeck.c.  Check
	whether optimizing and that the expression is a VAR_DECL not of
	array type instead of doing such checks in the caller.  Do not
	check pedantic.  Call gcc_unreachable for C++.
	* c-common.def (C_MAYBE_CONST_EXPR): New.
	* c-common.h (c_fully_fold, c_save_expr,
	decl_constant_value_for_optimization): New prototypes.
	(C_MAYBE_CONST_EXPR_PRE, C_MAYBE_CONST_EXPR_EXPR,
	C_MAYBE_CONST_EXPR_INT_OPERANDS, C_MAYBE_CONST_EXPR_NON_CONST,
	EXPR_INT_CONST_OPERANDS): Define.
	* c-convert.c (convert): Strip nops from expression.
	* c-decl.c (groktypename): Take extra parameters expr and
	expr_const_operands.  Update call to grokdeclarator.
	(start_decl): Update call to grokdeclarator.  Add statement for
	expressions used in type of decl.
	(grokparm): Update call to grokdeclarator.
	(push_parm_decl): Update call to grokdeclarator.
	(build_compound_literal): Add parameter non_const and build a
	C_MAYBE_COSNT_EXPR if applicable.
	(grokdeclarator): Take extra parameters expr and
	expr_const_operands.  Track expressions used in declaration
	specifiers and declarators.  Fold array sizes and track whether
	they are constant expressions and whether they are integer
	constant expressions.
	(parser_xref_tag): Set expr and expr_const_operands fields in
	return value.
	(grokfield): Update call to grokdeclarator.
	(start_function): Update call to grokdeclarator.
	(build_null_declspecs): Set expr and expr_const_operands fields in
	return value.
	(declspecs_add_type): Handle expressions in typeof specifiers.
	* c-parser.c (c_parser_declspecs): Set expr and
	expr_const_operands fields for declaration specifiers.
	(c_parser_enum_specifier): Likewise.
	(c_parser_struct_or_union_specifier): Likewise.
	(c_parser_typeof_specifier): Likewise.  Update call to
	groktypename.  Fold expression as needed.  Return expressions with
	type instead of adding statements.
	(c_parser_attributes): Update calls to c_parser_expr_list.
	(c_parser_statement_after_labels): Fold expression before passing
	to objc_build_throw_stmt.
	(c_parser_condition): Fold expression.
	(c_parser_asm_operands): Fold expression.
	(c_parser_conditional_expression): Use c_save_expr.  Update call
	to build_conditional_expr.
	(c_parser_alignof_expression): Update call to groktypename.
	(c_parser_postfix_expression): Preserve C_MAYBE_CONST_EXPR as
	original_code.  Fold expression argument of va_arg.  Create
	C_MAYBE_CONST_EXPR to preserve side effects of expressions in type
	argument to va_arg.  Update calls to groktypename.  Fold array
	index for offsetof.  Verify that first argument to
	__builtin_choose_expr has integer type.
	(c_parser_postfix_expression_after_paren_type): Update calls to
	groktypename and build_compound_literal.  Handle expressions with
	side effects in type name.
	(c_parser_postfix_expression_after_primary): Update call to
	c_parser_expr_list.  Set original_code for calls to
	__builtin_constant_p.
	(c_parser_expr_list): Take extra parameter fold_p.  Fold
	expressions if requested.
	(c_parser_objc_type_name): Update call to groktypename.
	(c_parser_objc_synchronized_statement): Fold expression.
	(c_parser_objc_receiver): Fold expression.
	(c_parser_objc_keywordexpr): Update call to c_parser_expr_list.
	(c_parser_omp_clause_num_threads, c_parser_omp_clause_schedule,
	c_parser_omp_atomic, c_parser_omp_for_loop): Fold expressions.
	* c-tree.h (CONSTRUCTOR_NON_CONST): Define.
	(struct c_typespec): Add elements expr and expr_const_operands.
	(struct c_declspecs): Add elements expr and expr_const_operands.
	(groktypename, build_conditional_expr, build_compound_literal):
	Update prototypes.
	(in_late_binary_op): Declare.
	* c-typeck.c (note_integer_operands): New function.
	(in_late_binary_op): New variable.
	(decl_constant_value_for_broken_optimization): Move to c-common.c
	and rename to decl_constant_value_for_optimization.
	(default_function_array_conversion): Do not strip nops.
	(default_conversion): Do not call
	decl_constant_value_for_broken_optimization.
	(build_array_ref): Do not fold result.
	(c_expr_sizeof_expr): Fold operand.  Use C_MAYBE_CONST_EXPR for
	result when operand is a VLA.
	(c_expr_sizeof_type): Update call to groktypename.  Handle
	expressions included in type name.  Use C_MAYBE_CONST_EXPR for
	result when operand names a VLA type.
	(build_function_call): Update call to build_compound_literal.
	Only fold result for calls to __builtin_* functions.  Strip
	NOP_EXPR from INTEGER_CST returned from such functions.  Fold
	the function designator.
	(convert_arguments): Fold arguments.  Update call to
	convert_for_assignment.
	(build_unary_op): Handle increment and decrement of
	C_MAYBE_CONST_EXPR.  Move lvalue checks for increment and
	decrement earlier.  Fold operand of increment and decrement.
	Handle address of C_MAYBE_CONST_EXPR.  Only fold expression being
	built for integer operand.  Wrap returns that are INTEGER_CSTs
	without being integer constant expressions or that have integer
	constant operands without being INTEGER_CSTs.
	(lvalue_p): Handle C_MAYBE_CONST_EXPR.
	(build_conditional_expr): Add operand ifexp_bcp.  Track whether
	result is an integer constant expression or can be used in
	unevaluated parts of one and avoid folding and wrap as
	appropriate.  Fold operands before possibly doing -Wsign-compare
	warnings.
	(build_compound_expr): Wrap result for C99 if operands can be used
	in integer constant expressions.
	(build_c_cast): Update call to digest_init.  Do not ignore
	overflow from casting floating-point constants to integers.  Wrap
	results that could be confused with integer constant expressions,
	null pointer constants or floating-point constants.
	(c_cast_expr): Update call to groktypename.  Handle expressions
	included in type name.
	(build_modify_expr): Handle modifying a C_MAYBE_CONST_EXPR.  Fold
	lhs inside possible SAVE_EXPR.  Fold RHS before assignment.
	Update calls to convert_for_assignment.
	(convert_for_assignment): Take new parameter
	null_pointer_constant.  Do not strip nops or call
	decl_constant_value_for_broken_optimization.  Set
	in_late_binary_op for conversions to boolean.
	(store_init_value): Update call to digest_init.
	(digest_init): Take new parameter null_pointer_constant.  Do not
	call decl_constant_value_for_broken_optimization.  pedwarn for
	initializers not constant expressions.  Update calls to
	convert_for_assignment.
	(constructor_nonconst): New.
	(struct constructor_stack): Add nonconst element.
	(really_start_incremental_init, push_init_level, pop_init_level):
	Handle constructor_nonconst and nonconst element.
	(set_init_index): Call constant_expression_warning for array
	designators.
	(output_init_element): Fold value.  Set constructor_nonconst as
	applicable.  pedwarn for initializers not constant expressions.
	Update call to digest_init.  Call constant_expression_warning
	where constant initializers are required.
	(process_init_element): Use c_save_expr.
	(c_finish_goto_ptr): Fold expression.
	(c_finish_return): Fold return value.  Update call to
	convert_for_assignment.
	(c_start_case): Fold switch expression.
	(c_process_expr_stmt): Fold expression.
	(c_finish_stmt_expr): Create C_MAYBE_CONST_EXPR as needed to
	ensure statement expression is not evaluated in constant
	expression.
	(build_binary_op): Track whether results are integer constant
	expressions or may occur in such, disable folding and wrap results
	as applicable.  Fold operands for -Wsign-compare warnings unless
	in_late_binary_op.
	(c_objc_common_truthvalue_conversion): Handle results folded to
	integer constants that are not integer constant expressions.
	* doc/extend.texi: Document when typeof operands are evaluated,
	that condition of __builtin_choose_expr is an integer constant
	expression, and more about use of __builtin_constant_p in
	initializers.

gcc/objc:
	* objc-act.c (objc_finish_try_stmt): Set in_late_binary_op.

gcc/testsuite:
	* gcc.c-torture/compile/20081108-1.c,
	gcc.c-torture/compile/20081108-2.c,
	gcc.c-torture/compile/20081108-3.c, gcc.dg/bconstp-2.c,
	gcc.dg/bconstp-3.c, gcc.dg/bconstp-4.c, gcc.dg/c90-const-expr-6.c,
	gcc.dg/c90-const-expr-7.c, gcc.dg/c90-const-expr-8.c,
	gcc.dg/c90-const-expr-9.c, gcc.dg/c90-const-expr-10.c,
	gcc.dg/c90-const-expr-11.c, gcc.dg/c99-const-expr-6.c,
	gcc.dg/c99-const-expr-7.c, gcc.dg/c99-const-expr-8.c,
	gcc.dg/c99-const-expr-9.c, gcc.dg/c99-const-expr-10.c,
	gcc.dg/c99-const-expr-11.c, gcc.dg/c99-const-expr-12.c,
	gcc.dg/c99-const-expr-13.c, gcc.dg/compare10.c,
	gcc.dg/gnu89-const-expr-1.c, gcc.dg/gnu89-const-expr-2.c,
	gcc.dg/gnu99-const-expr-1.c, gcc.dg/gnu99-const-expr-2.c,
	gcc.dg/gnu99-const-expr-3.c, gcc.dg/vla-12.c, gcc.dg/vla-13.c,
	gcc.dg/vla-14.c, gcc.dg/vla-15.c, gcc.dg/vla-16.c: New tests.
	* gcc.dg/c90-const-expr-1.c, gcc.dg/c90-const-expr-2.c,
	gcc.dg/c90-const-expr-3.c, gcc.dg/c99-const-expr-2.c,
	gcc.dg/c99-const-expr-3.c, gcc.dg/c99-static-1.c: Remove XFAILs.
	* gcc.dg/c90-const-expr-2.c: Use ZERO in place of 0 in another
	case.
	* gcc.dg/overflow-warn-1.c, gcc.dg/overflow-warn-2.c,
	gcc.dg/overflow-warn-3.c, gcc.dg/overflow-warn-4.c: Remove
	XFAILs.  Update expected messages.
	* gcc.dg/pr14649-1.c, gcc.dg/pr19984.c, gcc.dg/pr25682.c: Update
	expected messages.
	* gcc.dg/real-const-1.c: Replace with test from original PR.
	* gcc.dg/vect/pr32230.c: Use intermediate cast to __PTRDIFF_TYPE__
	when casting from non-constant integer to pointer.

Added:
    trunk/fixincludes/tests/base/tgmath.h
    trunk/gcc/testsuite/gcc.c-torture/compile/20081108-1.c
    trunk/gcc/testsuite/gcc.c-torture/compile/20081108-2.c
    trunk/gcc/testsuite/gcc.c-torture/compile/20081108-3.c
    trunk/gcc/testsuite/gcc.dg/bconstp-2.c
    trunk/gcc/testsuite/gcc.dg/bconstp-3.c
    trunk/gcc/testsuite/gcc.dg/bconstp-4.c
    trunk/gcc/testsuite/gcc.dg/c90-const-expr-10.c
    trunk/gcc/testsuite/gcc.dg/c90-const-expr-11.c
    trunk/gcc/testsuite/gcc.dg/c90-const-expr-6.c
    trunk/gcc/testsuite/gcc.dg/c90-const-expr-7.c
    trunk/gcc/testsuite/gcc.dg/c90-const-expr-8.c
    trunk/gcc/testsuite/gcc.dg/c90-const-expr-9.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-10.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-11.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-12.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-13.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-6.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-7.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-8.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-9.c
    trunk/gcc/testsuite/gcc.dg/compare10.c
    trunk/gcc/testsuite/gcc.dg/gnu89-const-expr-1.c
    trunk/gcc/testsuite/gcc.dg/gnu89-const-expr-2.c
    trunk/gcc/testsuite/gcc.dg/gnu99-const-expr-1.c
    trunk/gcc/testsuite/gcc.dg/gnu99-const-expr-2.c
    trunk/gcc/testsuite/gcc.dg/gnu99-const-expr-3.c
    trunk/gcc/testsuite/gcc.dg/vla-12.c
    trunk/gcc/testsuite/gcc.dg/vla-13.c
    trunk/gcc/testsuite/gcc.dg/vla-14.c
    trunk/gcc/testsuite/gcc.dg/vla-15.c
    trunk/gcc/testsuite/gcc.dg/vla-16.c
Modified:
    trunk/fixincludes/ChangeLog
    trunk/fixincludes/fixincl.x
    trunk/fixincludes/inclhack.def
    trunk/gcc/ChangeLog
    trunk/gcc/builtins.c
    trunk/gcc/c-common.c
    trunk/gcc/c-common.def
    trunk/gcc/c-common.h
    trunk/gcc/c-convert.c
    trunk/gcc/c-decl.c
    trunk/gcc/c-parser.c
    trunk/gcc/c-tree.h
    trunk/gcc/c-typeck.c
    trunk/gcc/doc/extend.texi
    trunk/gcc/objc/ChangeLog
    trunk/gcc/objc/objc-act.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.dg/c90-const-expr-1.c
    trunk/gcc/testsuite/gcc.dg/c90-const-expr-2.c
    trunk/gcc/testsuite/gcc.dg/c90-const-expr-3.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-2.c
    trunk/gcc/testsuite/gcc.dg/c99-const-expr-3.c
    trunk/gcc/testsuite/gcc.dg/c99-static-1.c
    trunk/gcc/testsuite/gcc.dg/overflow-warn-1.c
    trunk/gcc/testsuite/gcc.dg/overflow-warn-2.c
    trunk/gcc/testsuite/gcc.dg/overflow-warn-3.c
    trunk/gcc/testsuite/gcc.dg/overflow-warn-4.c
    trunk/gcc/testsuite/gcc.dg/pr14649-1.c
    trunk/gcc/testsuite/gcc.dg/pr19984.c
    trunk/gcc/testsuite/gcc.dg/pr25682.c
    trunk/gcc/testsuite/gcc.dg/real-const-1.c
    trunk/gcc/testsuite/gcc.dg/vect/pr32230.c

Comment 15 Joseph S. Myers 2009-03-29 18:18:14 UTC
Fixed for 4.5.