aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-08-30 22:40:35 +0000
committerDouglas Gregor <dgregor@apple.com>2011-08-30 22:40:35 +0000
commit1155c42e7b1b4e401bb0a331a6d715d637958c75 (patch)
treed60d3c86444da53ad09279f9818ea5376cbd8c1a /lib/Sema/SemaDeclCXX.cpp
parentb89d5ed785e2eb7dd64aa38d481d939155f62c41 (diff)
Allow C99 hexfloats in C++0x mode. This change resolves the standards
collision between C99 hexfloats and C++0x user-defined literals by giving C99 hexfloats precedence. Also, warning about user-defined literals that conflict with hexfloats and those that have names that are reserved by the implementation. Fixes <rdar://problem/9940194>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138839 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--lib/Sema/SemaDeclCXX.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index cd4023eeda..df0a5226c0 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -9048,6 +9048,30 @@ FinishedParams:
return true;
}
+ StringRef LiteralName
+ = FnDecl->getDeclName().getCXXLiteralIdentifier()->getName();
+ if (LiteralName[0] != '_') {
+ // C++0x [usrlit.suffix]p1:
+ // Literal suffix identifiers that do not start with an underscore are
+ // reserved for future standardization.
+ bool IsHexFloat = true;
+ if (LiteralName.size() > 1 &&
+ (LiteralName[0] == 'P' || LiteralName[0] == 'p')) {
+ for (unsigned I = 1, N = LiteralName.size(); I < N; ++I) {
+ if (!isdigit(LiteralName[I])) {
+ IsHexFloat = false;
+ break;
+ }
+ }
+ }
+
+ if (IsHexFloat)
+ Diag(FnDecl->getLocation(), diag::warn_user_literal_hexfloat)
+ << LiteralName;
+ else
+ Diag(FnDecl->getLocation(), diag::warn_user_literal_reserved);
+ }
+
return false;
}