diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2004-09-23 18:22:25 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@gcc.gnu.org> | 2004-09-23 18:22:25 +0000 |
commit | 037cc9c5dce2bd0569c90e67ab9760d36e1c620f (patch) | |
tree | df77b7d51d9b71c598887245fda31d867e50e5b6 /gcc/cp | |
parent | 093942ac675fab472ce829446c86b8233f25ee1d (diff) | |
download | gcc-037cc9c5dce2bd0569c90e67ab9760d36e1c620f.zip gcc-037cc9c5dce2bd0569c90e67ab9760d36e1c620f.tar.gz gcc-037cc9c5dce2bd0569c90e67ab9760d36e1c620f.tar.bz2 |
PR c++/9844, PR c++/13989
PR c++/9844, PR c++/13989
Reviewed by Mark Mitchel.
From-SVN: r87971
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/cvt.c | 15 | ||||
-rw-r--r-- | gcc/cp/decl.c | 22 | ||||
-rw-r--r-- | gcc/cp/parser.c | 8 |
3 files changed, 34 insertions, 11 deletions
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index cb179d5..5db4146 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -699,7 +699,20 @@ ocp_convert (tree type, tree expr, int convtype, int flags) if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type)) return fold (cp_convert_to_pointer (type, e, false)); if (code == VECTOR_TYPE) - return fold (convert_to_vector (type, e)); + { + tree in_vtype = TREE_TYPE (e); + if (IS_AGGR_TYPE (in_vtype)) + { + tree ret_val; + ret_val = build_type_conversion (type, e); + if (ret_val) + return ret_val; + if (flags & LOOKUP_COMPLAIN) + error ("`%#T' used where a `%T' was expected", in_vtype, type); + return error_mark_node; + } + return fold (convert_to_vector (type, e)); + } if (code == REAL_TYPE || code == COMPLEX_TYPE) { if (IS_AGGR_TYPE (TREE_TYPE (e))) diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 30bfa8b..b3cdd69 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -63,7 +63,8 @@ static void push_local_name (tree); static tree grok_reference_init (tree, tree, tree, tree *); static tree grokfndecl (tree, tree, tree, tree, tree, int, enum overload_flags, cp_cv_quals, - tree, int, int, int, int, int, int, tree); + tree, int, int, int, int, int, int, tree, + tree *); static tree grokvardecl (tree, tree, const cp_decl_specifier_seq *, int, int, tree); static void record_unknown_type (tree, const char *); @@ -5534,7 +5535,8 @@ grokfndecl (tree ctype, int inlinep, int funcdef_flag, int template_count, - tree in_namespace) + tree in_namespace, + tree* attrlist) { tree decl; int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE; @@ -5752,6 +5754,12 @@ grokfndecl (tree ctype, if (decl == error_mark_node) return NULL_TREE; + if (attrlist) + { + cplus_decl_attributes (&decl, *attrlist, 0); + *attrlist = NULL_TREE; + } + if (ctype != NULL_TREE && (! TYPE_FOR_JAVA (ctype) || check_java_method (decl)) && check) @@ -5762,7 +5770,7 @@ grokfndecl (tree ctype, (processing_template_decl > template_class_depth (ctype)) ? current_template_parms - : NULL_TREE); + : NULL_TREE); if (old_decl && TREE_CODE (old_decl) == TEMPLATE_DECL) /* Because grokfndecl is always supposed to return a @@ -7839,7 +7847,7 @@ grokdeclarator (const cp_declarator *declarator, unqualified_id, virtualp, flags, quals, raises, friendp ? -1 : 0, friendp, publicp, inlinep, - funcdef_flag, template_count, in_namespace); + funcdef_flag, template_count, in_namespace, attrlist); if (decl == NULL_TREE) return decl; #if 0 @@ -7886,7 +7894,7 @@ grokdeclarator (const cp_declarator *declarator, unqualified_id, virtualp, flags, quals, raises, friendp ? -1 : 0, friendp, 1, 0, funcdef_flag, - template_count, in_namespace); + template_count, in_namespace, attrlist); if (decl == NULL_TREE) return NULL_TREE; } @@ -8070,7 +8078,7 @@ grokdeclarator (const cp_declarator *declarator, virtualp, flags, quals, raises, 1, friendp, publicp, inlinep, funcdef_flag, - template_count, in_namespace); + template_count, in_namespace, attrlist); if (decl == NULL_TREE) return NULL_TREE; @@ -10088,8 +10096,6 @@ start_function (cp_decl_specifier_seq *declspecs, if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) return 0; - cplus_decl_attributes (&decl1, attrs, 0); - /* If #pragma weak was used, mark the decl weak now. */ if (global_scope_p (current_binding_level)) maybe_apply_pragma_weak (decl1); diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 05d5b6d..db779a2 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -7441,6 +7441,7 @@ cp_parser_conversion_type_id (cp_parser* parser) tree attributes; cp_decl_specifier_seq type_specifiers; cp_declarator *declarator; + tree type_specified; /* Parse the attributes. */ attributes = cp_parser_attributes_opt (parser); @@ -7452,8 +7453,11 @@ cp_parser_conversion_type_id (cp_parser* parser) /* Parse the conversion-declarator. */ declarator = cp_parser_conversion_declarator_opt (parser); - return grokdeclarator (declarator, &type_specifiers, TYPENAME, - /*initialized=*/0, &attributes); + type_specified = grokdeclarator (declarator, &type_specifiers, TYPENAME, + /*initialized=*/0, &attributes); + if (attributes) + cplus_decl_attributes (&type_specified, attributes, /*flags=*/0); + return type_specified; } /* Parse an (optional) conversion-declarator. |