Skip to content

[21613] Compilation error for sequences of nested typedefs in module #391

@mirean

Description

@mirean

Testing IDL:

module Test
{
  typedef char T_Char;
  typedef sequence<T_Char, 500> T_LongString;
  struct T_Description
  {
    T_LongString name;
  };
};

Running with

fastddsgen -example CMake -replace test.idl

Results in

[ 12%] Building CXX object CMakeFiles/test_lib.dir/testTypeObjectSupport.cxx.o
/home/dds/testTypeObjectSupport.cxx: In function 'void Test::register_T_LongString_type_identifier(eprosima::fastdds::dds::xtypes::TypeIdentifierPair&)':
/home/dds/testTypeObjectSupport.cxx:122:18: error: 'element_identifier_anonymous_sequence_Test' has not been declared
  122 |             bool element_identifier_anonymous_sequence_Test::T_Char_500_ec {false};
      |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dds/testTypeObjectSupport.cxx:122:76: error: qualified-id in declaration before '{' token
  122 |             bool element_identifier_anonymous_sequence_Test::T_Char_500_ec {false};
      |                                                                            ^
/home/dds/testTypeObjectSupport.cxx:123:29: error: 'element_identifier_anonymous_sequence_Test' has not been declared
  123 |             TypeIdentifier* element_identifier_anonymous_sequence_Test::T_Char_500 {new TypeIdentifier(TypeObjectUtils::retrieve_complete_type_identifier(type_ids_T_LongString, element_identifier_anonymous_sequence_Test::T_Char_500_ec))};
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dds/testTypeObjectSupport.cxx:123:84: error: qualified-id in declaration before '{' token
  123 |             TypeIdentifier* element_identifier_anonymous_sequence_Test::T_Char_500 {new TypeIdentifier(TypeObjectUtils::retrieve_complete_type_identifier(type_ids_T_LongString, element_identifier_anonymous_sequence_Test::T_Char_500_ec))};
      |                                                                                    ^
/home/dds/testTypeObjectSupport.cxx:124:18: error: 'element_identifier_anonymous_sequence_Test' has not been declared
  124 |             if (!element_identifier_anonymous_sequence_Test::T_Char_500_ec)
      |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dds/testTypeObjectSupport.cxx:129:29: error: 'equiv_kind_anonymous_sequence_Test' has not been declared
  129 |             EquivalenceKind equiv_kind_anonymous_sequence_Test::T_Char_500 = EK_COMPLETE;
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dds/testTypeObjectSupport.cxx:129:76: error: qualified-id in declaration before '=' token
  129 |             EquivalenceKind equiv_kind_anonymous_sequence_Test::T_Char_500 = EK_COMPLETE;
      |                                                                            ^
/home/dds/testTypeObjectSupport.cxx:132:17: error: 'equiv_kind_anonymous_sequence_Test' has not been declared
  132 |                 equiv_kind_anonymous_sequence_Test::T_Char_500 = EK_BOTH;
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dds/testTypeObjectSupport.cxx:134:35: error: 'element_flags_anonymous_sequence_Test' has not been declared
  134 |             CollectionElementFlag element_flags_anonymous_sequence_Test::T_Char_500 = 0;
      |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dds/testTypeObjectSupport.cxx:134:85: error: qualified-id in declaration before '=' token
  134 |             CollectionElementFlag element_flags_anonymous_sequence_Test::T_Char_500 = 0;
      |                                                                                     ^
/home/dds/testTypeObjectSupport.cxx:135:35: error: 'header_anonymous_sequence_Test' has not been declared
  135 |             PlainCollectionHeader header_anonymous_sequence_Test::T_Char_500 = TypeObjectUtils::build_plain_collection_header(equiv_kind_anonymous_sequence_Test::T_Char_500, element_flags_anonymous_sequence_Test::T_Char_500);
      |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dds/testTypeObjectSupport.cxx:135:78: error: qualified-id in declaration before '=' token
  135 |             PlainCollectionHeader header_anonymous_sequence_Test::T_Char_500 = TypeObjectUtils::build_plain_collection_header(equiv_kind_anonymous_sequence_Test::T_Char_500, element_flags_anonymous_sequence_Test::T_Char_500);
      |                                                                              ^
/home/dds/testTypeObjectSupport.cxx:138:102: error: 'header_anonymous_sequence_Test' has not been declared
  138 |                 PlainSequenceLElemDefn seq_ldefn = TypeObjectUtils::build_plain_sequence_l_elem_defn(header_anonymous_sequence_Test::T_Char_500, bound,
      |                                                                                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dds/testTypeObjectSupport.cxx:139:73: error: 'element_identifier_anonymous_sequence_Test' was not declared in this scope
  139 |                             eprosima::fastcdr::external<TypeIdentifier>(element_identifier_anonymous_sequence_Test::T_Char_500));
      |                                                                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [CMakeFiles/test_lib.dir/build.make:76: CMakeFiles/test_lib.dir/testTypeObjectSupport.cxx.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/test_lib.dir/all] Error 2

The issue also appears if using array instead of sequence.
It seems to be linked to the inclusion of the namespace in the name. If I manually remove the "Test::" from the above lines, compilation is successful.
The issue disappears if any of the following conditions is met:

  • No module is used
  • There is only one layer of typedefs (i.e. there is no T_Char, and the sequence uses char)

Unfortunately this layering appears in IDLs we have to use and we cannot modify them to get rid of the extra layer.

Versions (all built from source):
fastddsgen 4.0.0
Fast-DDS 3.0.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions