diff options
author | Ian Lance Taylor <iant@google.com> | 2011-12-22 20:49:18 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-12-22 20:49:18 +0000 |
commit | dcf3062542089393814c0dbda875ec6a30a6b0b0 (patch) | |
tree | ca873071c4c496e6c78949ec498ca1790eb53a15 /gcc/go/go-gcc.cc | |
parent | 42dfafa935db4f6f368499108307676dbf1317cc (diff) | |
download | gcc-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.cc | 28 |
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. |