Skip to content

clang-tidy & MSVC: Duplicate field names are not allowed #658

@PapeCoding

Description

@PapeCoding

Dear reflect-cpp team,
I currently encounter some errors using clang-tidy while building using MSVC (cl.exe). Without clang-tidy or with other compilers this is not a problem at all. Below you can find the attached (anonymized) error log:

D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\..\internal/enums\../..\internal/no_duplicate_field_names.hpp:22:19: error: static assertion failed due to requirement 'no_duplicate': Duplicate field names are not allowed in either named tuples or Literals. [clang-diagnostic-error]
   22 |     static_assert(no_duplicate,
      |                   ^~~~~~~~~~~~
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\..\internal/enums\../..\internal/no_duplicate_field_names.hpp:30:4: note: in instantiation of function template specialization 'rfl::internal::no_duplicate_field_names_helpers::compare_two_fields<rfl::Tuple<rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>>, 4, 3>' requested here
   30 |   (compare_two_fields<Fields, _i, _js>(), ...);
      |    ^
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\..\internal/enums\../..\internal/no_duplicate_field_names.hpp:35:4: note: in instantiation of function template specialization 'rfl::internal::no_duplicate_field_names_helpers::iterate_over_j<rfl::Tuple<rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>>, 4, 0, 1, 2, 3>' requested here
   35 |   (iterate_over_j<Fields, _is>(std::make_integer_sequence<int, _is>()), ...);
      |    ^
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\..\internal/enums\../..\internal/no_duplicate_field_names.hpp:46:39: note: in instantiation of function template specialization 'rfl::internal::no_duplicate_field_names_helpers::iterate_over_i<rfl::Tuple<rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>>, 0, 1, 2, 3, 4>' requested here
   46 |     no_duplicate_field_names_helpers::iterate_over_i<Fields>(
      |                                       ^
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\..\internal/enums\../../Literal.hpp:118:23: note: in instantiation of function template specialization 'rfl::internal::no_duplicate_field_names<rfl::Tuple<rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>, rfl::LiteralHelper<internal::StringLiteral<22>{{"get_field_name_str_vi"}}>>>' requested here
  118 |     return !internal::no_duplicate_field_names<FieldsType>();
      |                       ^
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\..\internal/enums\../../Literal.hpp:339:45: note: in instantiation of member function 'rfl::Literal<internal::StringLiteral<22>{{"get_field_name_str_vi"}}, internal::StringLiteral<22>{{"get_field_name_str_vi"}}, internal::StringLiteral<22>{{"get_field_name_str_vi"}}, internal::StringLiteral<22>{{"get_field_name_str_vi"}}, internal::StringLiteral<22>{{"get_field_name_str_vi"}}>::has_duplicates' requested here
  339 |   static_assert(sizeof...(fields_) <= 1 || !has_duplicates(),
      |                                             ^
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\..\internal\..\internal\..\internal/get_field_names.hpp:126:15: note: (skipping 8 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
  126 |   return rfl::Literal<_head, _tail...>::template from_value<0>();
      |               ^
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\../internal/has_default_val_v.hpp:31:41: note: in instantiation of template type alias 'named_tuple_t' requested here
   31 | struct HasDefaultVal<T> : HasDefaultVal<named_tuple_t<T>> {};
      |                                         ^
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\../internal/has_default_val_v.hpp:41:36: note: in instantiation of template class 'rfl::internal::HasDefaultVal<MyStruct>' requested here
   41 | constexpr bool has_default_val_v = HasDefaultVal<std::remove_cvref_t<T>>::value;
      |                                    ^
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json\../parsing\Parser_default.hpp:83:38: note: in instantiation of variable template specialization 'rfl::internal::has_default_val_v<MyStruct>' requested here
   83 |                            internal::has_default_val_v<T>) {
      |                                      ^
D:\workspace\proj\build-clang-tidy\_deps\reflect-cpp-src\include\rfl/json/read.hpp:48:44: note: in instantiation of member function 'rfl::parsing::Parser<rfl::json::Reader, rfl::json::Writer, MyStruct, rfl::Processors<rfl::DefaultIfMissing>>::read' requested here
   48 |   auto res = Parser<T, Processors<Ps...>>::read(r, InputVarType(root));
      |                                            ^
D:\workspace\proj\src\my-lib\src\attrib.hpp:57:17: note: in instantiation of function template specialization 'rfl::json::read<MyStruct, rfl::DefaultIfMissing>' requested here
   57 |                                         rfl::json::read<MyStruct, rfl::DefaultIfMissing>(

The struct in question looks like this:

struct MyStruct
{
	std::string message{};
	std::string ticket_id{};
	bool exclude{};
	std::vector<std::vector<std::string>> template_insts{};
	bool export_alias{};

	auto operator<=>(MyStruct const& other) const = default;
};

The error occurs using the following tooling:

  • Ninja (1.13.2)
  • MSVC (19.29.30159.0)
  • CMake (4.2.1)
  • Clang-Tidy (19.1.7)
  • reflect-cpp (0.24.0)

While this "error" is rather cosmetic as it only occurs using clang-tidy, it would be nice if you can take a look. Let me know if I can assist any further!

Best, Sebastian

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions