llvm-capstone/clang/test/SemaCXX/cxx2a-user-defined-literals.cpp
Erich Keane a67eb91047 Enable C++2a Chrono Literals
C++2a via http://wg21.link/p0355 permits the library
literals of 'd' and 'y'. This patch enables them in the
Lexer so that they can be properly parsed.

Note that 'd' gets confused with the hex character, so
modifications to how octal, binary, and decimal numbers are
parsed were required. Since this is simply making previously
invalid code legal, this should be fine.

Hex still greedily parses the 'd' as a hexit, since it would
a: violate [lex.ext]p1
b: break existing code.

Differential Revision: https://reviews.llvm.org/D49504

llvm-svn: 337454
2018-07-19 13:36:57 +00:00

28 lines
724 B
C++

// RUN: %clang_cc1 -std=c++2a %s -include %s -verify
#ifndef INCLUDED
#define INCLUDED
#pragma clang system_header
namespace std {
namespace chrono {
struct day{};
struct year{};
}
constexpr chrono::day operator"" d(unsigned long long d) noexcept;
constexpr chrono::year operator"" y(unsigned long long y) noexcept;
}
#else
using namespace std;
chrono::day dec_d = 5d;
chrono::day oct_d = 05d;
chrono::day bin_d = 0b011d;
// expected-error@+3{{no viable conversion from 'int' to 'chrono::day'}}
// expected-note@9{{candidate constructor (the implicit copy constructor)}}
// expected-note@9{{candidate constructor (the implicit move constructor)}}
chrono::day hex_d = 0x44d;
chrono::year y = 10y;
#endif