diff options
author | Ziemowit Laski <zlaski@apple.com> | 2005-05-24 22:22:33 +0000 |
---|---|---|
committer | Mike Stump <mrs@gcc.gnu.org> | 2005-05-24 22:22:33 +0000 |
commit | 660845bf3a71cab364902d2e3b0830f08572d8f4 (patch) | |
tree | 0a08a44cd858d7e984fbacfc004a39aa76e53504 /gcc | |
parent | d11dd684081e91ffda37451fd6be1059d055130b (diff) | |
download | gcc-660845bf3a71cab364902d2e3b0830f08572d8f4.zip gcc-660845bf3a71cab364902d2e3b0830f08572d8f4.tar.gz gcc-660845bf3a71cab364902d2e3b0830f08572d8f4.tar.bz2 |
class.c (layout_class_type): Do not issue C++ ABI warnings for ObjC structs.
* class.c (layout_class_type): Do not issue C++ ABI warnings
for ObjC structs.
* decl.c (objc_mark_locals_volatile): Streamline by calling
objc_volatilize_decl().
* parser.c (cp_parser_objc_message_expression): Allow simple
type specifiers (instead of merely type names) as message
receivers.
* pt.c (template_args_equal): Do not call objc_comptypes().
* typeck.c (composite_pointer_type): If both pointers are
ObjC-esque, arbitrarily choose the first; do not call
objc_comptypes().
(comptypes): Do not call objc_comptypes().
(convert_for_assignment): Call objc_compare_types().
(comp_ptr_ttypes_real): Call objc_type_quals_match() before
concluding that types do not match.
From-SVN: r100125
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 18 | ||||
-rw-r--r-- | gcc/cp/class.c | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 17 | ||||
-rw-r--r-- | gcc/cp/parser.c | 24 | ||||
-rw-r--r-- | gcc/cp/pt.c | 19 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 55 |
6 files changed, 72 insertions, 66 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f15e1e9..524c943 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,21 @@ +2005-05-24 Ziemowit Laski <zlaski@apple.com> + + * class.c (layout_class_type): Do not issue C++ ABI warnings + for ObjC structs. + * decl.c (objc_mark_locals_volatile): Streamline by calling + objc_volatilize_decl(). + * parser.c (cp_parser_objc_message_expression): Allow simple + type specifiers (instead of merely type names) as message + receivers. + * pt.c (template_args_equal): Do not call objc_comptypes(). + * typeck.c (composite_pointer_type): If both pointers are + ObjC-esque, arbitrarily choose the first; do not call + objc_comptypes(). + (comptypes): Do not call objc_comptypes(). + (convert_for_assignment): Call objc_compare_types(). + (comp_ptr_ttypes_real): Call objc_type_quals_match() before + concluding that types do not match. + 2005-05-24 Andrew Pinski <pinskia@physics.uc.edu> PR C++/21645 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index b70fb1f..d982b39 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -4681,6 +4681,11 @@ layout_class_type (tree t, tree *virtuals_p) comply with the ABI. */ if (warn_abi && DECL_C_BIT_FIELD (field) + /* The TREE_NO_WARNING flag gets set by Objective-C when + laying out an Objective-C class. The ObjC ABI differs + from the C++ ABI, and so we do not want a warning + here. */ + && !TREE_NO_WARNING (field) && !last_field_was_bitfield && !integer_zerop (size_binop (TRUNC_MOD_EXPR, DECL_FIELD_BIT_OFFSET (field), diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index eb8db91..0da9937 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -425,22 +425,7 @@ objc_mark_locals_volatile (void *enclosing_blk) tree decl; for (decl = scope->names; decl; decl = TREE_CHAIN (decl)) - { - /* Do not mess with variables that are 'static' or (already) - 'volatile'. */ - if (!TREE_THIS_VOLATILE (decl) && !TREE_STATIC (decl) - && (TREE_CODE (decl) == VAR_DECL - || TREE_CODE (decl) == PARM_DECL)) - { - TREE_TYPE (decl) - = build_qualified_type (TREE_TYPE (decl), - (TYPE_QUALS (TREE_TYPE (decl)) - | TYPE_QUAL_VOLATILE)); - TREE_THIS_VOLATILE (decl) = 1; - TREE_SIDE_EFFECTS (decl) = 1; - DECL_REGISTER (decl) = 0; - } - } + objc_volatilize_decl (decl); /* Do not climb up past the current function. */ if (scope->kind == sk_function_parms) diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index b0dee73..2527fb2 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -16258,8 +16258,8 @@ cp_parser_objc_message_expression (cp_parser* parser) /* Parse an objc-message-receiver. objc-message-receiver: - type-name expression + simple-type-specifier Returns a representation of the type or expression. */ @@ -16267,7 +16267,6 @@ static tree cp_parser_objc_message_receiver (cp_parser* parser) { tree rcv; - bool class_scope_p, template_p; /* An Objective-C message receiver may be either (1) a type or (2) an expression. */ @@ -16277,24 +16276,9 @@ cp_parser_objc_message_receiver (cp_parser* parser) if (cp_parser_parse_definitely (parser)) return rcv; - /* Look for the optional `::' operator. */ - cp_parser_global_scope_opt (parser, false); - /* Look for the nested-name-specifier. */ - cp_parser_nested_name_specifier_opt (parser, - /*typename_keyword_p=*/true, - /*check_dependency_p=*/true, - /*type_p=*/true, - /*is_declaration=*/true); - class_scope_p = (parser->scope && TYPE_P (parser->scope)); - template_p = class_scope_p && cp_parser_optional_template_keyword (parser); - /* Finally, look for the class-name. */ - rcv = cp_parser_class_name (parser, - class_scope_p, - template_p, - /*type_p=*/true, - /*check_dependency_p=*/true, - /*class_head_p=*/false, - /*is_declaration=*/true); + rcv = cp_parser_simple_type_specifier (parser, + /*decl_specs=*/NULL, + CP_PARSER_FLAGS_NONE); return objc_get_class_reference (rcv); } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f5e3f8a..1a1d5c0 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -4026,24 +4026,7 @@ template_args_equal (tree ot, tree nt) /* For member templates */ return TREE_CODE (ot) == TREE_VEC && comp_template_args (ot, nt); else if (TYPE_P (nt)) - { - int c1, c2; - - if (!TYPE_P (ot)) - return 0; - - /* We must handle ObjC types specially because they may differ - only in protocol qualifications (e.g., 'NSObject *' vs. - 'NSObject <Foo> *') that must be taken into account here. - See also cp/typeck.c:build_c_cast(), where a similar problem - arises. We must call objc_comptypes() twice, since its - comparisons are _not_ symmetric. */ - if ((c1 = objc_comptypes (ot, nt, 0)) >= 0 - && (c2 = objc_comptypes (nt, ot, 0)) >= 0) - return (c1 && c2); - - return same_type_p (ot, nt); - } + return TYPE_P (ot) && same_type_p (ot, nt); else if (TREE_CODE (ot) == TREE_VEC || TYPE_P (ot)) return 0; else diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 319e8ad..8bd1012 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -503,6 +503,13 @@ composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2, return build_type_attribute_variant (result_type, attributes); } + if (c_dialect_objc () && TREE_CODE (t1) == POINTER_TYPE + && TREE_CODE (t2) == POINTER_TYPE) + { + if (objc_compare_types (t1, t2, -3, NULL_TREE)) + return t1; + } + /* [expr.eq] permits the application of a pointer conversion to bring the pointers to a common type. */ if (TREE_CODE (t1) == POINTER_TYPE && TREE_CODE (t2) == POINTER_TYPE @@ -514,12 +521,10 @@ composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2, class1 = TREE_TYPE (t1); class2 = TREE_TYPE (t2); - if (DERIVED_FROM_P (class1, class2) || - (c_dialect_objc () && objc_comptypes (class1, class2, 0) == 1)) + if (DERIVED_FROM_P (class1, class2)) t2 = (build_pointer_type (cp_build_qualified_type (class1, TYPE_QUALS (class2)))); - else if (DERIVED_FROM_P (class2, class1) || - (c_dialect_objc () && objc_comptypes (class2, class1, 0) == 1)) + else if (DERIVED_FROM_P (class2, class1)) t1 = (build_pointer_type (cp_build_qualified_type (class2, TYPE_QUALS (class1)))); else @@ -1000,11 +1005,6 @@ comptypes (tree t1, tree t2, int strict) else if ((strict & COMPARE_DERIVED) && DERIVED_FROM_P (t2, t1)) break; - /* We may be dealing with Objective-C instances. */ - if (TREE_CODE (t1) == RECORD_TYPE - && objc_comptypes (t1, t2, 0) > 0) - break; - return false; case OFFSET_TYPE: @@ -5832,7 +5832,33 @@ convert_for_assignment (tree type, tree rhs, /* Simplify the RHS if possible. */ if (TREE_CODE (rhs) == CONST_DECL) rhs = DECL_INITIAL (rhs); - + + if (c_dialect_objc ()) + { + int parmno; + tree rname = fndecl; + + if (!strcmp (errtype, "assignment")) + parmno = -1; + else if (!strcmp (errtype, "initialization")) + parmno = -2; + else + { + tree selector = objc_message_selector (); + + parmno = parmnum; + + if (selector && parmno > 1) + { + rname = selector; + parmno -= 1; + } + } + + if (objc_compare_types (type, rhstype, parmno, rname)) + return convert (type, rhs); + } + /* [expr.ass] The expression is implicitly converted (clause _conv_) to the @@ -6257,10 +6283,15 @@ comp_ptr_ttypes_real (tree to, tree from, int constp) so the usual checks are not appropriate. */ if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE) { - if (!at_least_as_qualified_p (to, from)) + /* In Objective-C++, some types may have been 'volatilized' by + the compiler for EH; when comparing them here, the volatile + qualification must be ignored. */ + bool objc_quals_match = objc_type_quals_match (to, from); + + if (!at_least_as_qualified_p (to, from) && !objc_quals_match) return 0; - if (!at_least_as_qualified_p (from, to)) + if (!at_least_as_qualified_p (from, to) && !objc_quals_match) { if (constp == 0) return 0; |