diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-04-19 20:47:20 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-04-19 20:47:20 +0000 |
commit | c5c27f2a1f2610ea32c249f3def799ca97a65f6e (patch) | |
tree | 46fd170437b34eabf0479ee3f536cbc38375d498 | |
parent | 7f2ab897743a9d0fafeb7bb2d28d732ac46275bf (diff) | |
download | bcm5719-llvm-c5c27f2a1f2610ea32c249f3def799ca97a65f6e.tar.gz bcm5719-llvm-c5c27f2a1f2610ea32c249f3def799ca97a65f6e.zip |
Note that we support (and in fact have supported since the dawn of time itself)
C++1y binary literals.
llvm-svn: 179883
-rw-r--r-- | clang/include/clang/Basic/DiagnosticGroups.td | 21 | ||||
-rw-r--r-- | clang/include/clang/Basic/DiagnosticLexKinds.td | 5 | ||||
-rw-r--r-- | clang/lib/Lex/LiteralSupport.cpp | 9 | ||||
-rw-r--r-- | clang/test/Lexer/cxx1y_binary_literal.cpp | 19 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx98-compat-pedantic.cpp | 6 | ||||
-rw-r--r-- | clang/www/cxx_status.html | 2 |
6 files changed, 56 insertions, 6 deletions
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index 7e0438a2847..06b1f414f15 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -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">; diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index a84ce09f997..548823f1f0b 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -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">; diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 91da8223c18..09f4a682f05 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -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; diff --git a/clang/test/Lexer/cxx1y_binary_literal.cpp b/clang/test/Lexer/cxx1y_binary_literal.cpp new file mode 100644 index 00000000000..96dce3dd443 --- /dev/null +++ b/clang/test/Lexer/cxx1y_binary_literal.cpp @@ -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}} diff --git a/clang/test/SemaCXX/cxx98-compat-pedantic.cpp b/clang/test/SemaCXX/cxx98-compat-pedantic.cpp index 18fd1520ec4..3bcf7c435d8 100644 --- a/clang/test/SemaCXX/cxx98-compat-pedantic.cpp +++ b/clang/test/SemaCXX/cxx98-compat-pedantic.cpp @@ -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 diff --git a/clang/www/cxx_status.html b/clang/www/cxx_status.html index 5d3dd634074..d756ef25645 100644 --- a/clang/www/cxx_status.html +++ b/clang/www/cxx_status.html @@ -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> |