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 | 5610490cdfd7bbcbcbd5f166f18093089be8a464 (patch) | |
| tree | 76d8e93e5ac4c9b65114c46935756c3fe7d900a9 /clang/lib/Sema/DeclSpec.cpp | |
| parent | 7cade2cd2f027e8a85f49fb7d0316e3eb12eba65 (diff) | |
| download | bcm5719-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.cpp | 28 |
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; +} + |

