| # Copyright 2019 Google LLC |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| -- Test cases for types containing types. |
| |
| [$default byte_order: "LittleEndian"] |
| [(cpp) namespace: "emboss::test"] |
| |
| |
| struct Out: |
| struct In: |
| struct InIn: |
| enum InInIn: |
| NO = 0 |
| YES = 1 |
| |
| let outer_offset = 24 |
| |
| 0 [+1] InInIn field_enum |
| # In2 should be Out.In2, despite In2 appearing in an enclosing scope and |
| # later in the source file. |
| |
| 1 [+1] In2 in_2 |
| |
| 0 [+2] InIn in_in_1 |
| |
| 2 [+2] InIn in_in_2 |
| |
| 4 [+1] InIn.InInIn in_in_in_1 |
| |
| 5 [+1] In2 in_2 |
| |
| 6 [+1] UInt name_collision |
| # name_collision should resolve to Out.In.name_collision, not |
| # Out.name_collision, and there should be no error about ambiguous |
| # resolution. (Note that since field references are actually used at |
| # runtime, and there isn't necessarily any enclosing Out object for an |
| # Out.In at runtime, it does not make sense for a field name to resolve to |
| # a field in an outer struct.) |
| # TODO(bolms): Add a warning for this case, since it is somewhat subtle. |
| |
| name_collision [+1] UInt name_collision_check |
| |
| struct In2: |
| 0 [+1] UInt field_byte |
| |
| 0 [+8] In in_1 |
| 8 [+8] In in_2 |
| 16 [+2] In.InIn in_in_1 |
| 18 [+2] In.InIn in_in_2 |
| 20 [+1] In.InIn.InInIn in_in_in_1 |
| 21 [+1] In.InIn.InInIn in_in_in_2 |
| 22 [+2] UInt name_collision |
| In.InIn.outer_offset [+1] UInt nested_constant_check |