summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/DeclSpec.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2011-01-17 03:05:47 +0000
committerAnders Carlsson <andersca@mac.com>2011-01-17 03:05:47 +0000
commit5610490cdfd7bbcbcbd5f166f18093089be8a464 (patch)
tree76d8e93e5ac4c9b65114c46935756c3fe7d900a9 /clang/lib/Sema/DeclSpec.cpp
parent7cade2cd2f027e8a85f49fb7d0316e3eb12eba65 (diff)
downloadbcm5719-llvm-5610490cdfd7bbcbcbd5f166f18093089be8a464.tar.gz
bcm5719-llvm-5610490cdfd7bbcbcbd5f166f18093089be8a464.zip
Change ParseOptionalCXX0XVirtSpecifierSeq to take a VirtSpecifiers struct.
Enforce C++[class.mem]p8: A virt-specifier-seq shall contain at most one of each virt-specifier. llvm-svn: 123611
Diffstat (limited to 'clang/lib/Sema/DeclSpec.cpp')
-rw-r--r--clang/lib/Sema/DeclSpec.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp
index 4afdc24275f..5ead0c5f136 100644
--- a/clang/lib/Sema/DeclSpec.cpp
+++ b/clang/lib/Sema/DeclSpec.cpp
@@ -668,3 +668,31 @@ void UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc,
EndLocation = SymbolLocations[I];
}
}
+
+const char *VirtSpecifiers::getSpecifierName(VirtSpecifier VS) {
+ switch (VS) {
+ default: assert(0 && "Unknown specifier");
+ case VS_Override: return "override";
+ case VS_Final: return "final";
+ case VS_New: return "new";
+ }
+}
+
+bool VirtSpecifiers::SetVirtSpecifier(VirtSpecifier VS, SourceLocation Loc,
+ const char *&PrevSpec) {
+ if (Specifiers & VS) {
+ PrevSpec = getSpecifierName(VS);
+ return true;
+ }
+
+ Specifiers |= VS;
+
+ switch (VS) {
+ default: assert(0 && "Unknown specifier!");
+ case VS_Override: VS_overrideLoc = Loc; break;
+ case VS_Final: VS_finalLoc = Loc; break;
+ case VS_New: VS_newLoc = Loc; break;
+ }
+ return false;
+}
+
OpenPOWER on IntegriCloud