aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2004-09-23 18:22:25 +0000
committerFariborz Jahanian <fjahanian@gcc.gnu.org>2004-09-23 18:22:25 +0000
commit037cc9c5dce2bd0569c90e67ab9760d36e1c620f (patch)
treedf77b7d51d9b71c598887245fda31d867e50e5b6 /gcc/cp
parent093942ac675fab472ce829446c86b8233f25ee1d (diff)
downloadgcc-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.c15
-rw-r--r--gcc/cp/decl.c22
-rw-r--r--gcc/cp/parser.c8
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.