зеркало из https://github.com/microsoft/clang-1.git
Note that we support (and in fact have supported since the dawn of time itself)
C++1y binary literals. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179883 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
87a9f2b2d7
Коммит
2fcf0de8a1
|
@ -80,6 +80,11 @@ def ExtraSemi : DiagGroup<"extra-semi", [CXX11ExtraSemi]>;
|
|||
def FormatExtraArgs : DiagGroup<"format-extra-args">;
|
||||
def FormatZeroLength : DiagGroup<"format-zero-length">;
|
||||
|
||||
// Warnings for C++1y code which is not compatible with prior C++ standards.
|
||||
def CXXPre1yCompat : DiagGroup<"cxx98-cxx11-compat">;
|
||||
def CXXPre1yCompatPedantic : DiagGroup<"cxx98-cxx11-compat-pedantic",
|
||||
[CXXPre1yCompat]>;
|
||||
|
||||
def CXX98CompatBindToTemporaryCopy :
|
||||
DiagGroup<"c++98-compat-bind-to-temporary-copy">;
|
||||
def CXX98CompatLocalTypeTemplateArgs :
|
||||
|
@ -90,9 +95,12 @@ def CXX98CompatUnnamedTypeTemplateArgs :
|
|||
def CXX98Compat : DiagGroup<"c++98-compat",
|
||||
[CXX98CompatBindToTemporaryCopy,
|
||||
CXX98CompatLocalTypeTemplateArgs,
|
||||
CXX98CompatUnnamedTypeTemplateArgs]>;
|
||||
CXX98CompatUnnamedTypeTemplateArgs,
|
||||
CXXPre1yCompat]>;
|
||||
// Warnings for C++11 features which are Extensions in C++98 mode.
|
||||
def CXX98CompatPedantic : DiagGroup<"c++98-compat-pedantic", [CXX98Compat]>;
|
||||
def CXX98CompatPedantic : DiagGroup<"c++98-compat-pedantic",
|
||||
[CXX98Compat,
|
||||
CXXPre1yCompatPedantic]>;
|
||||
|
||||
def CXX11Narrowing : DiagGroup<"c++11-narrowing">;
|
||||
|
||||
|
@ -110,8 +118,11 @@ def ReservedUserDefinedLiteral :
|
|||
|
||||
def CXX11Compat : DiagGroup<"c++11-compat",
|
||||
[CXX11Narrowing,
|
||||
CXX11CompatReservedUserDefinedLiteral]>;
|
||||
CXX11CompatReservedUserDefinedLiteral,
|
||||
CXXPre1yCompat]>;
|
||||
def : DiagGroup<"c++0x-compat", [CXX11Compat]>;
|
||||
def CXX11CompatPedantic : DiagGroup<"c++11-compat-pedantic",
|
||||
[CXXPre1yCompatPedantic]>;
|
||||
|
||||
def : DiagGroup<"effc++">;
|
||||
def DivZero : DiagGroup<"division-by-zero">;
|
||||
|
@ -477,6 +488,10 @@ def NonGCC : DiagGroup<"non-gcc",
|
|||
// earlier C++ versions.
|
||||
def CXX11 : DiagGroup<"c++11-extensions", [CXX11ExtraSemi, CXX11LongLong]>;
|
||||
|
||||
// A warning group for warnings about using C++1y features as extensions in
|
||||
// earlier C++ versions.
|
||||
def CXX1y : DiagGroup<"c++1y-extensions">;
|
||||
|
||||
def : DiagGroup<"c++0x-extensions", [CXX11]>;
|
||||
def DelegatingCtorCycles :
|
||||
DiagGroup<"delegating-ctor-cycles">;
|
||||
|
|
|
@ -174,6 +174,11 @@ def ext_hexconstant_invalid : Extension<
|
|||
"hexadecimal floating constants are a C99 feature">, InGroup<C99>;
|
||||
def ext_binary_literal : Extension<
|
||||
"binary integer literals are a GNU extension">, InGroup<GNU>;
|
||||
def ext_binary_literal_cxx1y : Extension<
|
||||
"binary integer literals are a C++1y extension">, InGroup<CXX1y>;
|
||||
def warn_cxx11_compat_binary_literal : Warning<
|
||||
"binary integer literals are incompatible with C++ standards before C++1y">,
|
||||
InGroup<CXXPre1yCompatPedantic>, DefaultIgnore;
|
||||
def err_pascal_string_too_long : Error<"Pascal string is too long">;
|
||||
def warn_octal_escape_too_large : ExtWarn<"octal escape sequence out of range">;
|
||||
def warn_hex_escape_too_large : ExtWarn<"hex escape sequence out of range">;
|
||||
|
|
|
@ -686,8 +686,13 @@ void NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {
|
|||
|
||||
// Handle simple binary numbers 0b01010
|
||||
if (*s == 'b' || *s == 'B') {
|
||||
// 0b101010 is a GCC extension.
|
||||
PP.Diag(TokLoc, diag::ext_binary_literal);
|
||||
// 0b101010 is a C++1y / GCC extension.
|
||||
PP.Diag(TokLoc,
|
||||
PP.getLangOpts().CPlusPlus1y
|
||||
? diag::warn_cxx11_compat_binary_literal
|
||||
: PP.getLangOpts().CPlusPlus
|
||||
? diag::ext_binary_literal_cxx1y
|
||||
: diag::ext_binary_literal);
|
||||
++s;
|
||||
radix = 2;
|
||||
DigitsBegin = s;
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
// RUN: %clang_cc1 -std=c++1y %s -verify
|
||||
|
||||
static_assert(0b1001 == 9, "");
|
||||
|
||||
using I = int;
|
||||
using I = decltype(0b101001);
|
||||
using ULL = unsigned long long;
|
||||
using ULL = decltype(0b10101001ULL);
|
||||
|
||||
constexpr unsigned long long operator""_foo(unsigned long long n) {
|
||||
return n * 2;
|
||||
}
|
||||
static_assert(0b10001111_foo == 286, "");
|
||||
|
||||
int k1 = 0b1234; // expected-error {{invalid digit '2' in binary constant}}
|
||||
// FIXME: If we ever need to support a standard suffix starting with [a-f],
|
||||
// we'll need to rework our binary literal parsing rules.
|
||||
int k2 = 0b10010f; // expected-error {{invalid digit 'f' in binary constant}}
|
||||
int k3 = 0b10010g; // expected-error {{invalid suffix 'g' on integer constant}}
|
|
@ -1,3 +1,5 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -std=c++1y -DCXX1Y -Wc++98-compat-pedantic -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++1y -DCXX1Y -Wc++98-compat -Werror %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wc++98-compat-pedantic -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wc++98-compat -Werror %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++98 -Werror %s
|
||||
|
@ -38,3 +40,7 @@ long long ll1 = // expected-warning {{'long long' is incompatible with C++98}}
|
|||
unsigned long long ull1 = // expected-warning {{'long long' is incompatible with C++98}}
|
||||
42ULL; // expected-warning {{'long long' is incompatible with C++98}}
|
||||
|
||||
int k = 0b1001;
|
||||
#ifdef CXX1Y
|
||||
// expected-warning@-2 {{binary integer literals are incompatible with C++ standards before C++1y}}
|
||||
#endif
|
||||
|
|
|
@ -419,7 +419,7 @@ available.</p>
|
|||
<tr>
|
||||
<td>[PROVISIONAL] Binary literals</td>
|
||||
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3472.pdf">N3472</a></td>
|
||||
<td class="none" align="center">No</td>
|
||||
<td class="full" align="center">Yes</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[PROVISIONAL] Return type deduction for normal functions</td>
|
||||
|
|
Загрузка…
Ссылка в новой задаче