http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60835

            Bug ID: 60835
           Summary: Please support __attribute__((format_arg)) on class
                    types as well as char*
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: b.r.longbons at gmail dot com

It would be nice if GCC could remember if an "opaque" class contains a format
string.

The logical extension of this is that a function with __attribute__((format()))
could take a class type that was returned from the __attribute__((format_arg))
function.

Other than ordinary functions, the low-level cases are:
- constructor: std::string::string(const char *)        (possibly complicated)
- member function: const char *std::string::c_str()     (probably easy)
- UDL: std::string operator "" s (const char *, size_t) (already works for
non-class return types)

Some high level uses:
- Returning an owned string from a gettext()-like function.
- Completely forbidding char* and char[] for strings in a codebase (currently,
I'm using a nop UDL on the format strings and a real UDL on all others, which
isn't terrible but it would be nice to complete it).


Testcase:
// compile with -Wformat=2 -std=c++11
#include <cstdio>

struct String
{
    const char *str;

    // 'this' is arg 1; there is no return type for a ctor
    __attribute__((format_arg(2)))
    String(const char *s) : str(s) {}

    __attribute__((format_arg(1)))
    const char *c_str() const { return str; }
};

static __attribute__((format_arg(1)))
String operator "" _s(const char *s, size_t)
{
    return String(s);
}

int main()
{
    printf("Hello, world!\n"_s.c_str());
}

Reply via email to