aboutsummaryrefslogtreecommitdiff
path: root/gcc/go/go-gcc.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2011-12-22 20:49:18 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-12-22 20:49:18 +0000
commitdcf3062542089393814c0dbda875ec6a30a6b0b0 (patch)
treeca873071c4c496e6c78949ec498ca1790eb53a15 /gcc/go/go-gcc.cc
parent42dfafa935db4f6f368499108307676dbf1317cc (diff)
downloadgcc-dcf3062542089393814c0dbda875ec6a30a6b0b0.zip
gcc-dcf3062542089393814c0dbda875ec6a30a6b0b0.tar.gz
gcc-dcf3062542089393814c0dbda875ec6a30a6b0b0.tar.bz2
go-gcc.cc (set_placeholder_pointer_type): Arrange for the type name to have a DECL_ORIGINAL_TYPE as gcc expects.
* go-gcc.cc (set_placeholder_pointer_type): Arrange for the type name to have a DECL_ORIGINAL_TYPE as gcc expects. (set_placeholder_struct_type): Likewise. (set_placeholder_array_type): Likewise. (named_type): Set DECL_ORIGINAL_TYPE. From-SVN: r182639
Diffstat (limited to 'gcc/go/go-gcc.cc')
-rw-r--r--gcc/go/go-gcc.cc28
1 files changed, 24 insertions, 4 deletions
diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc
index f5214db..b4ec275 100644
--- a/gcc/go/go-gcc.cc
+++ b/gcc/go/go-gcc.cc
@@ -619,6 +619,13 @@ Gcc_backend::set_placeholder_pointer_type(Btype* placeholder,
}
gcc_assert(TREE_CODE(tt) == POINTER_TYPE);
TREE_TYPE(pt) = TREE_TYPE(tt);
+ if (TYPE_NAME(pt) != NULL_TREE)
+ {
+ // Build the data structure gcc wants to see for a typedef.
+ tree copy = build_variant_type_copy(pt);
+ TYPE_NAME(copy) = NULL_TREE;
+ DECL_ORIGINAL_TYPE(TYPE_NAME(pt)) = copy;
+ }
return true;
}
@@ -654,6 +661,12 @@ Gcc_backend::set_placeholder_struct_type(
tree t = placeholder->get_tree();
gcc_assert(TREE_CODE(t) == RECORD_TYPE && TYPE_FIELDS(t) == NULL_TREE);
Btype* r = this->fill_in_struct(placeholder, fields);
+
+ // Build the data structure gcc wants to see for a typedef.
+ tree copy = build_variant_type_copy(t);
+ TYPE_NAME(copy) = NULL_TREE;
+ DECL_ORIGINAL_TYPE(TYPE_NAME(t)) = copy;
+
return r->get_tree() != error_mark_node;
}
@@ -681,6 +694,12 @@ Gcc_backend::set_placeholder_array_type(Btype* placeholder,
tree t = placeholder->get_tree();
gcc_assert(TREE_CODE(t) == ARRAY_TYPE && TREE_TYPE(t) == NULL_TREE);
Btype* r = this->fill_in_array(placeholder, element_btype, length);
+
+ // Build the data structure gcc wants to see for a typedef.
+ tree copy = build_variant_type_copy(t);
+ TYPE_NAME(copy) = NULL_TREE;
+ DECL_ORIGINAL_TYPE(TYPE_NAME(t)) = copy;
+
return r->get_tree() != error_mark_node;
}
@@ -693,12 +712,13 @@ Gcc_backend::named_type(const std::string& name, Btype* btype,
tree type = btype->get_tree();
if (type == error_mark_node)
return this->error_type();
- type = build_variant_type_copy(type);
+ tree copy = build_variant_type_copy(type);
tree decl = build_decl(location.gcc_location(), TYPE_DECL,
get_identifier_from_string(name),
- type);
- TYPE_NAME(type) = decl;
- return this->make_type(type);
+ copy);
+ DECL_ORIGINAL_TYPE(decl) = type;
+ TYPE_NAME(copy) = decl;
+ return this->make_type(copy);
}
// Return a pointer type used as a marker for a circular type.