diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-07-08 18:18:04 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-07-08 18:18:04 +0000 |
commit | 914aefe65981e817d170141c71349bdfaf00202d (patch) | |
tree | 952c7029b6ca37b9e104ec074b550c700cc22dbf /lib/Sema/SemaType.cpp | |
parent | 0d54d89118a9afa3d6b64b0098a16ebe4a916215 (diff) |
Sema: Don't allow CVR qualifiers before structors
We would silently accept volatile ~S() when the user probably intended
to write virtual ~S().
This fixes PR20238.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@212555 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaType.cpp')
-rw-r--r-- | lib/Sema/SemaType.cpp | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 29c03f8484..ff48ebc53f 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -1989,18 +1989,15 @@ static void inferARCWriteback(TypeProcessingState &state, // TODO: mark whether we did this inference? } -static void diagnoseIgnoredQualifiers( - Sema &S, unsigned Quals, - SourceLocation FallbackLoc, - SourceLocation ConstQualLoc = SourceLocation(), - SourceLocation VolatileQualLoc = SourceLocation(), - SourceLocation RestrictQualLoc = SourceLocation(), - SourceLocation AtomicQualLoc = SourceLocation()) { +void Sema::diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals, + SourceLocation FallbackLoc, + SourceLocation ConstQualLoc, + SourceLocation VolatileQualLoc, + SourceLocation RestrictQualLoc, + SourceLocation AtomicQualLoc) { if (!Quals) return; - const SourceManager &SM = S.getSourceManager(); - struct Qual { unsigned Mask; const char *Name; @@ -2027,7 +2024,8 @@ static void diagnoseIgnoredQualifiers( SourceLocation QualLoc = QualKinds[I].Loc; if (!QualLoc.isInvalid()) { FixIts[NumQuals] = FixItHint::CreateRemoval(QualLoc); - if (Loc.isInvalid() || SM.isBeforeInTranslationUnit(QualLoc, Loc)) + if (Loc.isInvalid() || + getSourceManager().isBeforeInTranslationUnit(QualLoc, Loc)) Loc = QualLoc; } @@ -2035,7 +2033,7 @@ static void diagnoseIgnoredQualifiers( } } - S.Diag(Loc.isInvalid() ? FallbackLoc : Loc, diag::warn_qual_return_type) + Diag(Loc.isInvalid() ? FallbackLoc : Loc, DiagID) << QualStr << NumQuals << FixIts[0] << FixIts[1] << FixIts[2] << FixIts[3]; } @@ -2046,8 +2044,9 @@ static void diagnoseRedundantReturnTypeQualifiers(Sema &S, QualType RetTy, if (D.getTypeObject(FunctionChunkIndex).Fun.hasTrailingReturnType()) { // FIXME: TypeSourceInfo doesn't preserve location information for // qualifiers. - diagnoseIgnoredQualifiers(S, RetTy.getLocalCVRQualifiers(), - D.getIdentifierLoc()); + S.diagnoseIgnoredQualifiers(diag::warn_qual_return_type, + RetTy.getLocalCVRQualifiers(), + D.getIdentifierLoc()); return; } @@ -2061,8 +2060,9 @@ static void diagnoseRedundantReturnTypeQualifiers(Sema &S, QualType RetTy, case DeclaratorChunk::Pointer: { DeclaratorChunk::PointerTypeInfo &PTI = OuterChunk.Ptr; - diagnoseIgnoredQualifiers( - S, PTI.TypeQuals, + S.diagnoseIgnoredQualifiers( + diag::warn_qual_return_type, + PTI.TypeQuals, SourceLocation(), SourceLocation::getFromRawEncoding(PTI.ConstQualLoc), SourceLocation::getFromRawEncoding(PTI.VolatileQualLoc), @@ -2079,8 +2079,9 @@ static void diagnoseRedundantReturnTypeQualifiers(Sema &S, QualType RetTy, // FIXME: We can't currently provide an accurate source location and a // fix-it hint for these. unsigned AtomicQual = RetTy->isAtomicType() ? DeclSpec::TQ_atomic : 0; - diagnoseIgnoredQualifiers(S, RetTy.getCVRQualifiers() | AtomicQual, - D.getIdentifierLoc()); + S.diagnoseIgnoredQualifiers(diag::warn_qual_return_type, + RetTy.getCVRQualifiers() | AtomicQual, + D.getIdentifierLoc()); return; } @@ -2095,12 +2096,13 @@ static void diagnoseRedundantReturnTypeQualifiers(Sema &S, QualType RetTy, // Just parens all the way out to the decl specifiers. Diagnose any qualifiers // which are present there. - diagnoseIgnoredQualifiers(S, D.getDeclSpec().getTypeQualifiers(), - D.getIdentifierLoc(), - D.getDeclSpec().getConstSpecLoc(), - D.getDeclSpec().getVolatileSpecLoc(), - D.getDeclSpec().getRestrictSpecLoc(), - D.getDeclSpec().getAtomicSpecLoc()); + S.diagnoseIgnoredQualifiers(diag::warn_qual_return_type, + D.getDeclSpec().getTypeQualifiers(), + D.getIdentifierLoc(), + D.getDeclSpec().getConstSpecLoc(), + D.getDeclSpec().getVolatileSpecLoc(), + D.getDeclSpec().getRestrictSpecLoc(), + D.getDeclSpec().getAtomicSpecLoc()); } static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, |