diff options
author | Andrey Bokhanko <andreybokhanko@gmail.com> | 2016-07-29 10:42:48 +0000 |
---|---|---|
committer | Andrey Bokhanko <andreybokhanko@gmail.com> | 2016-07-29 10:42:48 +0000 |
commit | edaa4311e54be8a88ba9881ad9689ed9d0f60da2 (patch) | |
tree | e0ff738e9ef5f409d44e0f2c99c44e7badc1d9fb /lib/Sema | |
parent | 3ebf3b24cf37c2870f671eea0041dcff73994804 (diff) | |
download | clang-edaa4311e54be8a88ba9881ad9689ed9d0f60da2.tar.gz |
[GCC] Support for __final specifier
As reported in bug 28473, GCC supports "final" functionality in pre-C++11 code using the __final keyword. Clang currently supports the "final" keyword in accordance with the C++11 specification, however it ALSO supports it in pre-C++11 mode, with a warning.
This patch adds the "__final" keyword for compatibility with GCC in GCC Keywords mode (so it is enabled with existing flags), and issues a warning on its usage (suggesting switching to the C++11 keyword). This patch also adds a regression test for the functionality described. I believe this patch has minimal impact, as it simply adds a new keyword for existing behavior.
This has been validated with check-clang to avoid regressions. Patch is created in reference to revisions 276665.
Patch by Erich Keane.
Differential Revision: https://reviews.llvm.org/D22919
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@277134 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/DeclSpec.cpp | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/lib/Sema/DeclSpec.cpp b/lib/Sema/DeclSpec.cpp index c294658c03..42d4633dd8 100644 --- a/lib/Sema/DeclSpec.cpp +++ b/lib/Sema/DeclSpec.cpp @@ -1299,6 +1299,7 @@ bool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc, switch (VS) { default: llvm_unreachable("Unknown specifier!"); case VS_Override: VS_overrideLoc = Loc; break; + case VS_GNU_Final: case VS_Sealed: case VS_Final: VS_finalLoc = Loc; break; } @@ -1311,6 +1312,7 @@ const char *VirtSpecifiers::getSpecifierName(Specifier VS) { default: llvm_unreachable("Unknown specifier"); case VS_Override: return "override"; case VS_Final: return "final"; + case VS_GNU_Final: return "__final"; case VS_Sealed: return "sealed"; } } |