diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGenCXX/cxx11-user-defined-literal.cpp | 5 | ||||
-rw-r--r-- | test/Parser/cxx11-user-defined-literals.cpp | 25 |
2 files changed, 28 insertions, 2 deletions
diff --git a/test/CodeGenCXX/cxx11-user-defined-literal.cpp b/test/CodeGenCXX/cxx11-user-defined-literal.cpp index fbd3621014..4bd49c8b94 100644 --- a/test/CodeGenCXX/cxx11-user-defined-literal.cpp +++ b/test/CodeGenCXX/cxx11-user-defined-literal.cpp @@ -3,13 +3,16 @@ struct S { S(); ~S(); S(const S &); void operator()(int); }; using size_t = decltype(sizeof(int)); S operator"" _x(const char *, size_t); +S operator"" _y(wchar_t); void f() { // CHECK: call void @_Zli2_xPKcm({{.*}}, i8* getelementptr inbounds ([4 x i8]* @{{.*}}, i32 0, i32 0), i64 3) // CHECK: call void @_Zli2_xPKcm({{.*}}, i8* getelementptr inbounds ([4 x i8]* @{{.*}}, i32 0, i32 0), i64 3) + // CHECK: call void @_Zli2_yw({{.*}} 97) // CHECK: call void @_ZN1SD1Ev({{.*}}) nounwind // CHECK: call void @_ZN1SD1Ev({{.*}}) nounwind - "foo"_x, "bar"_x; + // CHECK: call void @_ZN1SD1Ev({{.*}}) nounwind + "foo"_x, "bar"_x, L'a'_y; } template<typename T> auto g(T t) -> decltype("foo"_x(t)) { return "foo"_x(t); } diff --git a/test/Parser/cxx11-user-defined-literals.cpp b/test/Parser/cxx11-user-defined-literals.cpp index e3f79ecc7c..80ff741ba0 100644 --- a/test/Parser/cxx11-user-defined-literals.cpp +++ b/test/Parser/cxx11-user-defined-literals.cpp @@ -59,14 +59,37 @@ void h() { (void)"test"_id "test" L"test"; } -enum class LitKind { CharStr, WideStr, Char16Str, Char32Str }; +enum class LitKind { Char, WideChar, Char16, Char32, CharStr, WideStr, Char16Str, Char32Str }; +constexpr LitKind operator"" _kind(char p) { return LitKind::Char; } +constexpr LitKind operator"" _kind(wchar_t p) { return LitKind::WideChar; } +constexpr LitKind operator"" _kind(char16_t p) { return LitKind::Char16; } +constexpr LitKind operator"" _kind(char32_t p) { return LitKind::Char32; } constexpr LitKind operator"" _kind(const char *p, size_t n) { return LitKind::CharStr; } constexpr LitKind operator"" _kind(const wchar_t *p, size_t n) { return LitKind::WideStr; } constexpr LitKind operator"" _kind(const char16_t *p, size_t n) { return LitKind::Char16Str; } constexpr LitKind operator"" _kind(const char32_t *p, size_t n) { return LitKind::Char32Str; } +static_assert('x'_kind == LitKind::Char, ""); +static_assert(L'x'_kind == LitKind::WideChar, ""); +static_assert(u'x'_kind == LitKind::Char16, ""); +static_assert(U'x'_kind == LitKind::Char32, ""); static_assert("foo"_kind == LitKind::CharStr, ""); static_assert(u8"foo"_kind == LitKind::CharStr, ""); static_assert(L"foo"_kind == LitKind::WideStr, ""); static_assert(u"foo"_kind == LitKind::Char16Str, ""); static_assert(U"foo"_kind == LitKind::Char32Str, ""); + +// Test source location for suffix is known +const char *p = + "foo\nbar" R"x( + erk + flux + )x" "eep\x1f"\ +_no_such_suffix // expected-error {{'_no_such_suffix'}} +"and a bit more" +"and another suffix"_no_such_suffix; + +// And for character literals +char c = + '\x14'\ +_no_such_suffix; // expected-error {{'_no_such_suffix'}} |