Fast-DDS-Gen icon indicating copy to clipboard operation
Fast-DDS-Gen copied to clipboard

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

Open mirean opened this issue 1 year ago • 1 comments

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

mirean avatar Sep 05 '24 09:09 mirean

Hi @mirean, thanks for your report. The eProsima team will review it in the following days and come back with some feedback.

JesusPoderoso avatar Sep 09 '24 14:09 JesusPoderoso