diff options
author | Anders Carlsson <andersca@mac.com> | 2011-01-17 03:05:47 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2011-01-17 03:05:47 +0000 |
commit | b971dbdb65149a7cf0c046380186d0204e5b411e (patch) | |
tree | 34252a6fc4d166a18b78501d10761a5e50d833b1 /lib/Sema/DeclSpec.cpp | |
parent | 5be38be82a6631786624625d010d695d529802a8 (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123611 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/DeclSpec.cpp')
-rw-r--r-- | lib/Sema/DeclSpec.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/Sema/DeclSpec.cpp b/lib/Sema/DeclSpec.cpp index 4afdc24275..5ead0c5f13 100644 --- a/lib/Sema/DeclSpec.cpp +++ b/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; +} + |