Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to disable GCC warning about missing underscore in user defined literal?

void operator"" test( const char* str, size_t sz  )
{
    std::cout<<str<<" world";
}

int main()
{
    "hello"test;
    return 0;
}

In GCC 4.7, this generates "warning: literal operator suffixes not preceded by '_' are reserved for future standardization [enabled by default]"

I understand why this warning is generated, but GCC says "enabled by default".

Is it possible to disable this warning without just disabling all warnings via the -w flag?

like image 789
cmeub Avatar asked Mar 12 '13 06:03

cmeub


People also ask

How do I turn off GCC warning?

If the value of y is always 1, 2 or 3, then x is always initialized, but GCC doesn't know this. To suppress the warning, you need to provide a default case with assert(0) or similar code. This option also warns when a non-volatile automatic variable might be changed by a call to longjmp.

How does GCC treat warning errors?

The warning is emitted only with --coverage enabled. By default, this warning is enabled and is treated as an error. -Wno-coverage-invalid-line-number can be used to disable the warning or -Wno-error=coverage-invalid-line-number can be used to disable the error.

What is numeric literal operator?

Numeric Literals. Numeric literals consist of continuous sequences of numbers with a maximum of 31 digits (0 to 9). These sequences can be prefixed directly by a plus (+) or minus (-) sign. Numeric literals between -2147483648 and 2147483647 are integer literals and have the built-in ABAP type i.


2 Answers

After reading several comments to this question, I reviewed the C++ 11 Standard (non-final draft N3337).

When I said "I understand why this warning is generated" I was mistaken. I assumed that an underscore was not technically required by the standard, but just a recommendation (hence the warning rather than an error).

But as Nicol Bolas has brought up, the standard uses the following language when speaking about user defined literals:

"Literal suffix identifiers that do not start with an underscore are reserved for future standardization." usrlit.suffix

"Some literal suffix identifiers are reserved for future standardization; see [usrlit.suffix]. A declaration whose literal-operator-id uses such a literal suffix identifier is ill-formed, no diagnostic required." over.literal

This is similar to the language used for reserved identifiers and the "alternative representations" such as "and", "or", "not". I think this makes it pretty clear that this shouldn't actually be a warning in the first place, but an error.

This may not be the direct answer to the question of "is it possible to disable", but it is answer enough for me.

like image 155
cmeub Avatar answered Oct 15 '22 01:10

cmeub


For what it is worth, -Wno-literal-suffix silences this warning since gcc-7 (see here live on godbold), i.e. this option also turns off warnings for user defined literal operators without leading underscore:

-Wliteral-suffix (C++ and Objective-C++ only)

...

Additionally, warn when a user-defined literal operator is declared with a literal suffix identifier that doesn’t begin with an underscore. Literal suffix identifiers that don’t begin with an underscore are reserved for future standardization.


However, one should stick to the advice in @cmeub's answer and rather avoid using literal suffix identifiers without underscore, as it leads to ill formed programs.

like image 36
ead Avatar answered Oct 15 '22 02:10

ead