[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