[cfe-dev] literal suffixes for std::basic_string?

Eli Friedman eli.friedman at gmail.com
Mon Jul 22 11:59:05 PDT 2013


On Mon, Jul 22, 2013 at 11:22 AM, Marshall Clow <mclow.lists at gmail.com> wrote:
> I'm trying to implement N3642 in libc++ (User-defined literals for standard library types) and I'm running into something I don't understand.
>
> I tried to implement them in a standalone program, and got errors from clang:
>> string_literal.cpp:6:21: warning: user-defined literal suffixes not starting
>>       with '_' are reserved; no literal will invoke this operator
>
> Ok, fine. I developed my (and tested my code) using underscores. That all works (see attached "string_literal.cpp")
>
> [ All the code here was built with TOT clang and "-std=c++1y -stdlib=libc++ -I $LLVM/libcxx/include"  ]
>
> Then I dropped the code into libc++'s <string> header and removed the underscores (patch attached).
> No warnings - so apparently clang can tell when the code is in a system header.

Yes... but it's probably just suppressing the warning, not actually
changing the behavior.

> But if I uncomment the code that uses those operators (starting about line 46 of string_literal.cpp), I get the following errors:
>
>> string_literal.cpp:46:48: error: invalid suffix on literal; C++11 requires a
>>       space between literal and identifier [-Wreserved-user-defined-literal]
>>         static_assert ( std::is_same<decltype(   "hi"s), std::string>::v...
>>                                                      ^
>>
>> string_literal.cpp:46:48: error: expected ')'
>> string_literal.cpp:46:40: note: to match this '('
>>         static_assert ( std::is_same<decltype(   "hi"s), std::string>::v...
>>                                              ^
>> string_literal.cpp:46:3: error: static_assert failed ""
>>         static_assert ( std::is_same<decltype(   "hi"s), std::string>::value, "...
>>         ^               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> which, it seems to me, are just wrong.
>
> Maybe I screwed up putting the stuff into <string> (but that looks ok to me).
> I thought I might be using the wrong set of libc++ header files, but I checked, and I don't think that's happening, either.
>
> Any suggestions?

User-defined literals without underscores are reserved... and so
without any guidance from the standard as to what they are supposed to
do, clang just ignores them outright.

-Eli



More information about the cfe-dev mailing list