Skip to content

fmt::sprintf warnings on Intel icpc/icpx #2619

@ischoegl

Description

@ischoegl

I ran into an issue with fmt::sprintf, which results in unexpected warnings on Intel compilers (using intel-oneAPI 2021.4.0) together with fmt v8.0.1 (installed via conda); the same issues appear with v6.2.1 (which I started with).

The warnings can be triggered using the following trivial test case answer.cpp:

#include <iostream>
#include <fmt/printf.h>

int main()
{
    // either of the two statements produce warnings
    std::cout << fmt::sprintf("The answer is %g", 42.0) << std::endl;
    std::cout << fmt::sprintf("The answer is %i", 42) << std::endl;
}

Using Intel's new compilers, warnings are generated regardless of options

$ icpx -o answer.o -c -I/home/user/miniconda3/include answer.cpp
In file included from answer.cpp:2:
In file included from /home/home/miniconda3/include/fmt/printf.h:15:
/home/home/miniconda3/include/fmt/format.h:1783:33: warning: comparison with infinity always evaluates to false in fast floating point modes [-Wtautological-constant-compare]
    return write_nonfinite(out, std::isinf(value), specs, fspecs);
                                ^~~~~~~~~~~~~~~~~
/home/home/miniconda3/include/fmt/format.h:1989:20: note: in instantiation of function template specialization 'fmt::detail::write<char, fmt::appender, float, 0>' requested here
    return detail::write(out, value, specs, locale);
                   ^
/home/home/miniconda3/include/fmt/core.h:1469:12: note: in instantiation of function template specialization 'fmt::detail::printf_arg_formatter<fmt::appender, char>::operator()<float, 0>' requested here
    return vis(arg.value_.float_value);
           ^
/home/home/miniconda3/include/fmt/printf.h:559:3: note: in instantiation of function template specialization 'fmt::detail::vprintf<char, fmt::basic_printf_context<fmt::appender, char>>' requested here
  vprintf(buffer, to_string_view(fmt), args);
  ^
/home/home/miniconda3/include/fmt/printf.h:576:10: note: in instantiation of function template specialization 'fmt::vsprintf<fmt::basic_string_view<char>, char>' requested here
  return vsprintf(to_string_view(fmt), fmt::make_format_args<context>(args...));
         ^
answer.cpp:7:23: note: in instantiation of function template specialization 'fmt::sprintf<char [17], double, char>' requested here
    std::cout << fmt::sprintf("The answer is %g", 42.0) << std::endl;
                      ^
[...]

Somewhat different issues are observed for icpc if the option Wcheck is used:

$ icpc -o answer.o -c -I/home/user/miniconda3/include -Wcheck answer.cpp
/home/user/miniconda3/include/fmt/printf.h(413): warning #2259: non-pointer conversion from "int" to "char" may lose significant bits
        c = it != end ? *it : 0;
          ^
          detected during:
            instantiation of "void fmt::v8::detail::vprintf(fmt::v8::detail::buffer<Char> &, fmt::v8::basic_string_view<Char>, fmt::v8::basic_format_args<Context>) [with Char=char, Context=fmt::v8::printf_context]" at line 559
            instantiation of "auto fmt::v8::vsprintf(const S &, fmt::v8::basic_format_args<fmt::v8::basic_printf_context_t<fmt::v8::type_identity_t<Char>>>)->std::__cxx11::basic_string<Char, std::char_traits<Char>, std::allocator<Char>> [with S=fmt::v8::basic_string_view<char>, Char=char]" at line 576
            instantiation of "auto fmt::v8::sprintf(const S &, const T &...)->std::__cxx11::basic_string<Char, std::char_traits<Char>, std::allocator<Char>> [with S=char [17], T=<double>, Char=char]" at line 7 of "answer.cpp"
[...]

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