[cfe-commits] r164858 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td include/clang/Basic/TokenKinds.h include/clang/Lex/MacroInfo.h include/clang/Lex/Token.h lib/Lex/MacroInfo.cpp lib/Sema/AnalysisBasedWarnings.cpp test/SemaCXX/switc

Dmitri Gribenko gribozavr at gmail.com
Sat Sep 29 02:27:35 PDT 2012


On Sat, Sep 29, 2012 at 1:24 AM, Alexander Kornienko <alexfh at google.com> wrote:
> --- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp (original)
> +++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp Fri Sep 28 17:24:03 2012
> @@ -36,6 +36,7 @@
>  #include "clang/Analysis/Analyses/ThreadSafety.h"
>  #include "clang/Analysis/CFGStmtMap.h"
>  #include "clang/Analysis/Analyses/UninitializedValues.h"
> +#include "llvm/ADT/ArrayRef.h"
>  #include "llvm/ADT/BitVector.h"
>  #include "llvm/ADT/FoldingSet.h"
>  #include "llvm/ADT/ImmutableMap.h"
> @@ -678,6 +679,61 @@
>    return true;
>  }
>
> +/// \brief Stores token information for comparing actual tokens with
> +/// predefined values. Only handles simple tokens and identifiers.
> +class TokenValue {
> +  tok::TokenKind Kind;
> +  IdentifierInfo *II;
> +
> +public:
> +  TokenValue(tok::TokenKind Kind) : Kind(Kind), II(0) {
> +    assert(Kind != tok::raw_identifier && "Raw identifiers are not supported.");
> +    assert(Kind != tok::identifier &&
> +           "Identifiers should be created by TokenValue(IdentifierInfo *)");
> +    assert(!tok::isLiteral(Kind) && "Literals are not supported.");
> +    assert(!tok::isAnnotation(Kind) && "Annotations are not supported.");
> +  }
> +  TokenValue(IdentifierInfo *II) : Kind(tok::identifier), II(II) {}
> +  bool operator==(const Token &Tok) const {
> +    return Tok.getKind() == Kind &&
> +        (!II || II == Tok.getIdentifierInfo());
> +  }
> +};
> +
> +/// \brief Compares macro tokens with a specified token value sequence.
> +static bool MacroDefinitionEquals(const MacroInfo *MI,
> +                                  llvm::ArrayRef<TokenValue> Tokens) {
> +  return Tokens.size() == MI->getNumTokens() &&
> +      std::equal(Tokens.begin(), Tokens.end(), MI->tokens_begin());
> +}
> +
> +static std::string GetSuitableSpelling(Preprocessor &PP, SourceLocation L,
> +                                       llvm::ArrayRef<TokenValue> Tokens,
> +                                       const char *Spelling) {
> +  SourceManager &SM = PP.getSourceManager();
> +  SourceLocation BestLocation;
> +  std::string BestSpelling = Spelling;
> +  for (Preprocessor::macro_iterator I = PP.macro_begin(), E = PP.macro_end();
> +       I != E; ++I) {
> +    if (!I->second->isObjectLike())
> +      continue;
> +    const MacroInfo *MI = I->second->findDefinitionAtLoc(L, SM);
> +    if (!MI)
> +      continue;
> +    if (!MacroDefinitionEquals(MI, Tokens))
> +      continue;
> +    SourceLocation Location = I->second->getDefinitionLoc();
> +    // Choose the macro defined latest.
> +    if (BestLocation.isInvalid() ||
> +        (Location.isValid() &&
> +         SM.isBeforeInTranslationUnit(BestLocation, Location))) {
> +      BestLocation = Location;
> +      BestSpelling = I->first->getName();
> +    }
> +  }
> +  return BestSpelling;
> +}

Hi Alexander,

I want to use this in the AST library to suggest a proper macro for
__attribute__((deprecated)).  Does it make sense to move these helper
infrastructure from Sema to the Preprocessor class itself?

Dmitri

-- 
main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
(j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/



More information about the cfe-commits mailing list