Quuxplusone / LLVMBugzillaTest

0 stars 0 forks source link

ClangCL can't use UDL with /std:c++latest #39520

Open Quuxplusone opened 5 years ago

Quuxplusone commented 5 years ago
Bugzilla Link PR40549
Status NEW
Importance P enhancement
Reported by Stephen Kelly (steveire@gmail.com)
Reported on 2019-01-31 09:43:14 -0800
Last modified on 2019-01-31 12:47:10 -0800
Version trunk
Hardware PC Windows NT
CC efriedma@quicinc.com, llvm-bugs@lists.llvm.org, neeilans@live.com, richard-llvm@metafoo.co.uk, rnk@google.com, Tom.Tan@microsoft.com
Fixed by commit(s)
Attachments
Blocks
Blocked by
See also
This occurs while trying to implement a user-defined literal. Attempting to
compile code without char8_t and with

 A a2 = u8"\u4F60\u597D"_sv;

results in

u8.cpp(24,28):  error: no matching literal operator for call to 'operator""_sv'
with arguments of types
      'const char8_t *' and 'unsigned long long', and no matching literal operator template
    A a2 = u8"\u4F60\u597D"_sv;

Trying to add an overload with char8_t results in:

u8.cpp(10,1):  error: cannot mangle this built-in char8_t type yet
A operator "" _sv(const char8_t* str, INT len)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

So, currently UDL can't be used with /std:c++latest

struct A
{
  A()  {}
};

#define INT unsigned long long

#ifdef TRY_U8
A operator "" _sv(const char8_t* str, INT len)
{
    return A{};
}
#endif

A operator "" _sv(const char* str, INT len)
{
    return A{};
}

int main()
{
    A a1 = "hello"_sv;
#ifdef TRY_U8
    A a2 = u8"\u4F60\u597D"_sv;
#endif
}
Quuxplusone commented 5 years ago

This doesn't affect all UDLs; only 'u8' UDLs are a problem. This is happening because u8 character and string literals changed type (from char to char8_t) in C++20, and we don't yet know what mangling MS is going to give the type char8_t.