diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-04-30 18:24:01 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-04-30 18:24:01 +0000 |
commit | 24b75e69558daefe92b017e2366560f62e961dfb (patch) | |
tree | f990b71fd75cd070515e06e64defec420dd4d3ac /lib/Sema/DeclSpec.cpp | |
parent | 63e8e2d9a7c10bcac479235898812627cb74650f (diff) |
Sema: Implement DR477
Summary: Friend declarations shouldn't mention explicit or virtual.
Reviewers: rsmith
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D3562
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207682 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/DeclSpec.cpp')
-rw-r--r-- | lib/Sema/DeclSpec.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/lib/Sema/DeclSpec.cpp b/lib/Sema/DeclSpec.cpp index 5c2006f6e9..69415ce34d 100644 --- a/lib/Sema/DeclSpec.cpp +++ b/lib/Sema/DeclSpec.cpp @@ -1125,14 +1125,41 @@ void DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP, const PrintingPoli ThreadHint = FixItHint::CreateRemoval(SCLoc); } - Diag(D, SCLoc, diag::err_friend_storage_spec) + Diag(D, SCLoc, diag::err_friend_decl_spec) << SpecName << StorageHint << ThreadHint; ClearStorageClassSpecs(); } + // C++11 [dcl.fct.spec]p5: + // The virtual specifier shall be used only in the initial + // declaration of a non-static class member function; + // C++11 [dcl.fct.spec]p6: + // The explicit specifier shall be used only in the declaration of + // a constructor or conversion function within its class + // definition; + if (isFriendSpecified() && (isVirtualSpecified() || isExplicitSpecified())) { + StringRef Keyword; + SourceLocation SCLoc; + + if (isVirtualSpecified()) { + Keyword = "virtual"; + SCLoc = getVirtualSpecLoc(); + } else { + Keyword = "explicit"; + SCLoc = getExplicitSpecLoc(); + } + + FixItHint Hint = FixItHint::CreateRemoval(SCLoc); + Diag(D, SCLoc, diag::err_friend_decl_spec) + << Keyword << Hint; + + FS_virtual_specified = FS_explicit_specified = false; + FS_virtualLoc = FS_explicitLoc = SourceLocation(); + } + assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType)); - + // Okay, now we can infer the real type. // TODO: return "auto function" and other bad things based on the real type. |