diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-10-19 00:07:01 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-10-19 00:07:01 +0000 |
commit | 77faa365cb2322cfc8edf58a4f5d68f2370cc39a (patch) | |
tree | 0037d28e1b6631f91ebc0d04430abae8c4c8feda /lib/Sema/Sema.cpp | |
parent | b224343723f514123dc7181ba9543ac361b35416 (diff) |
-Wc++98-compat: warn if a SFINAE substitution in C++11 suppresses an access
control diagnostic.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142463 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/Sema.cpp')
-rw-r--r-- | lib/Sema/Sema.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 4a9d8a5efb..8346cc475f 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -625,10 +625,19 @@ Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() { if (llvm::Optional<TemplateDeductionInfo*> Info = SemaRef.isSFINAEContext()) { switch (DiagnosticIDs::getDiagnosticSFINAEResponse(getDiagID())) { case DiagnosticIDs::SFINAE_Report: - // Fall through; we'll report the diagnostic below. + // We'll report the diagnostic below. break; - case DiagnosticIDs::SFINAE_AccessControl: + case DiagnosticIDs::SFINAE_SubstitutionFailure: + // Count this failure so that we know that template argument deduction + // has failed. + ++SemaRef.NumSFINAEErrors; + SemaRef.Diags.setLastDiagnosticIgnored(); + SemaRef.Diags.Clear(); + Clear(); + return; + + case DiagnosticIDs::SFINAE_AccessControl: { // Per C++ Core Issue 1170, access control is part of SFINAE. // Additionally, the AccessCheckingSFINAE flag can be used to temporary // make access control a part of SFINAE for the purposes of checking @@ -636,16 +645,25 @@ Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() { if (!SemaRef.AccessCheckingSFINAE && !SemaRef.getLangOptions().CPlusPlus0x) break; - - case DiagnosticIDs::SFINAE_SubstitutionFailure: - // Count this failure so that we know that template argument deduction - // has failed. + + SourceLocation Loc = getLocation(); + + // Suppress this diagnostic. ++SemaRef.NumSFINAEErrors; SemaRef.Diags.setLastDiagnosticIgnored(); SemaRef.Diags.Clear(); Clear(); + + // Now the diagnostic state is clear, produce a C++98 compatibility + // warning. + SemaRef.Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control); + + // The last diagnostic which Sema produced was ignored. Suppress any + // notes attached to it. + SemaRef.Diags.setLastDiagnosticIgnored(); return; - + } + case DiagnosticIDs::SFINAE_Suppress: // Make a copy of this suppressed diagnostic and store it with the // template-deduction information; |