This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
And now with the patch. Ian On Mon, Apr 13, 2009 at 1:28 PM, Ian Lance Taylor <iant@google.com> wrote: > In C++, this kind of code is invalid: > > enum e { A = 1, B = 2, C = 4 }; > extern void f1(enum e); > void f2() { f1(A | B); } > > The expression A | B has type "int", not type "enum e". ?Passing an int > to a function which expects an enum is an invalid conversion in C++. > > gcc's C++ frontend uses this construct all over the place in the form of > the tsubst_flags_t enum. ?The values are bitmasks (tf_error, tf_warning, > etc.) which are or'ed together. ?The functions which take combinations > of these bits are declared with the type tsubst_flags_t. > > I have an unsubmitted patch to the C frontend which makes cases like > this an error when using -Wc++-compat. ?In preparation for submitting > that patch, I would like to clean up the C++ frontend. > > The patch in this e-mail messages changes tsubst_flags_t to int. ?It > eliminates the tsubst_flags_t typedef. ?Since type names ending in "_t" > are reserved by POSIX, I also renamed the enum type (the "_t" is > probably OK in C but probably not OK in C++). > > This is how I think the code looks best--I don't see a need for a > special type to hold this combination of bitfields. ?However, it would > be a smaller change to let the C++ frontend continue to use > tsubst_flags_t, and simply do "typedef int tsubst_flags_t". ?If the C++ > frontend maintainers would prefer that patch, I can do that instead. > > This patch was bootstrapped and tested on i686-pc-linux-gnu. > > OK for mainline? > > Ian > > > 2009-04-13 ?Ian Lance Taylor ?<iant@google.com> > > ? ? ? ?* cp-tree.h (enum tsubst_flags): Rename from enum tsubst_flags_t. > ? ? ? ?(tsubst_flags_t): Remove typedef. > ? ? ? ?* cp-tree.h: Change parameter types from tsubst_flags_t to int in > ? ? ? ?declarations. > ? ? ? ?* call.c (standard_conversion): Change tflags from tsubst_flags_t > ? ? ? ?to int. > ? ? ? ?(build_new_function_call): Change parameter type from > ? ? ? ?tsubst_flags_t to int. > ? ? ? ?(build_object_call, build_conditional_expr): Likewise. > ? ? ? ?(build_new_op, convert_like_real, build_over_call): Likewise. > ? ? ? ?(build_special_member_call, build_new_method_call): Likewise. > ? ? ? ?(perform_implicit_conversion): Likewise. > ? ? ? ?(perform_direct_initialization_if_possible): Likewise. > ? ? ? ?* class.c (resolve_address_of_overloaded_function): Likewise. > ? ? ? ?(instantiate_type): Likewise. > ? ? ? ?* cp-lang.c (objcp_tsubst_copy_and_build): Likewise. > ? ? ? ?* cvt.c (convert_to_void): Likewise. > ? ? ? ?* decl.c (make_typename_type): Likewise. > ? ? ? ?(make_unbound_class_template): Likewise. > ? ? ? ?* init.c (build_aggr_init): Likewise. > ? ? ? ?(expand_default_init, expand_aggr_init_1): Likewise. > ? ? ? ?(build_new_1, build_new, build_vec_init): Likewise. > ? ? ? ?* pt.c (reduce_template_parm_level): Likewise. > ? ? ? ?(coerce_template_template_parm): Likewise. > ? ? ? ?(coerce_template_template_parms): Likewise. > ? ? ? ?(convert_template_argument): Likewise. > ? ? ? ?(coerce_template_parameter_pack): Likewise. > ? ? ? ?(coerce_template_parms, lookup_template_class): Likewise. > ? ? ? ?(apply_late_template_attributes): Likewise. > ? ? ? ?(tsubst_template_arg, tsubst_pack_expansion): Likewise. > ? ? ? ?(tsubst_template_args, tsubst_template_parms): Likewise. > ? ? ? ?(tsubst_aggr_type, tsubst_decl, tsubst_arg_types): Likewise. > ? ? ? ?(tsubst_function_type, tsubst_exception_specification): Likewise. > ? ? ? ?(tsubst, tsubst_baselink, tsubst_copy): Likewise. > ? ? ? ?(tsubst_omp_clauses, tsubst_copy_asm_operands): Likewise. > ? ? ? ?(tsubst_omp_for_iterator, tsubst_expr): Likewise. > ? ? ? ?(tsubst_non_call_postfix_expression): Likewise. > ? ? ? ?(tsubst_copy_and_build): Likewise. > ? ? ? ?(check_instantiated_arg, check_instantiated_args): Likewise. > ? ? ? ?(instantiate_template, do_type_instantiation): Likewise. > ? ? ? ?(invalid_nontype_parm_type_p): Likewise. > ? ? ? ?* rtti.c (build_dynamic_cast_1): Likewise. > ? ? ? ?(build_dynamic_cast): Likewise. > ? ? ? ?* semantics.c (finish_call_expr): Likewise. > ? ? ? ?* tree.c (cp_build_qualified_type_real): Likewise. > ? ? ? ?* typeck.c (composite_pointer_type_r): Likewise. > ? ? ? ?(composite_pointer_type, cxx_sizeof_expr): Likewise. > ? ? ? ?(cxx_alignof_expr, invalid_nonstatic_memfn_p): Likewise. > ? ? ? ?(rationalize_conditional_expr): Likewise. > ? ? ? ?(build_class_member_access_expr): Likewise. > ? ? ? ?(finish_class_member_access_expr): Likewise. > ? ? ? ?(build_x_indirect_ref, cp_build_indirect_ref): Likewise. > ? ? ? ?(cp_build_function_call, convert_arguments): Likewise. > ? ? ? ?(build_x_binary_op, build_x_array_ref): Likewise. > ? ? ? ?(cp_build_binary_op, build_x_unary_op): Likewise. > ? ? ? ?(cp_build_unary_op, build_x_conditional_expr): Likewise. > ? ? ? ?(build_x_compound_expr, cp_build_compound_expr): Likewise. > ? ? ? ?(build_static_cast_1, build_static_cast): Likewise. > ? ? ? ?(build_reinterpret_cast_1, build_reinterpret_cast): Likewise. > ? ? ? ?(build_const_cast, cp_build_c_cast): Likewise. > ? ? ? ?(cp_build_modify_expr, build_x_modify_expr): Likewise. > ? ? ? ?(convert_for_assignment, convert_for_initialization): Likewise. > ? ? ? ?(lvalue_or_else): Likewise. > ? ? ? ?* typeck2.c (build_functional_cast): Likewise. > ? ? ? ?* cp-objcp-common.h (objcp_tsubst_copy_and_build): Update > ? ? ? ?declaration. >
Attachment:
foo.txt
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |