[Bug c/31871] C99 failure to diagnose non-integer cast

jsm28 at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Fri Oct 24 19:38:00 GMT 2008



------- Comment #4 from jsm28 at gcc dot gnu dot org  2008-10-24 19:36 -------
Subject: Bug 31871

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


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31871



More information about the Gcc-bugs mailing list