[cfe-commits] [PATCH] Compatibility macro detection for the -Wimplicit-fallthrough diagnostic.

Richard Smith reviews at llvm-reviews.chandlerc.com
Wed Sep 26 12:33:34 PDT 2012



================
Comment at: tools/clang/lib/Lex/MacroInfo.cpp:64
@@ +63,3 @@
+  for (const MacroInfo *MI = this; MI; MI = MI->PreviousDefinition) {
+    if (!SM.getFileEntryForID(SM.getFileID(MI->Location)) ||
+        SM.isBeforeInTranslationUnit(MI->Location, L))
----------------
Under what circumstances is this test necessary?

================
Comment at: tools/clang/lib/Lex/MacroInfo.cpp:65
@@ +64,3 @@
+    if (!SM.getFileEntryForID(SM.getFileID(MI->Location)) ||
+        SM.isBeforeInTranslationUnit(MI->Location, L))
+      return (MI->UndefLocation.isInvalid() ||
----------------
Alexander Kornienko wrote:
> Can anyone confirm, that this is the right method to find out if the macro was defined before a specific source location?
> I've tried SM.isBeforeInSLocAddrSpace(), but it seemed to be wrong.
Yes, that's the right test.

================
Comment at: tools/clang/lib/Sema/AnalysisBasedWarnings.cpp:687
@@ +686,3 @@
+       it != MI->tokens_end(); ++it) {
+    StringRef S = PP.getSpelling(*it, Buf);
+    if (StringRef(P, S.size()) != S)
----------------
Alexander Kornienko wrote:
> If this seems to be not efficient, does anyone have an idea of how to conveniently create a Token array for a known character sequence (run Lexer? fill by hand? both ways seem to be too verbose).
> And after that, how to compare two token sequences? Manually compare getKind() and for certain kinds getIdentifierInfo(), getLiteralData(), getAnnotationValue() and some flags?
I would recommend that you pass in a list of token values to look for, where a token value is a TokenKind and (for a tok_identifier) an IdentifierInfo*, rather than passing in a const char* and comparing it against the macro's spelling. That would be faster, and would also catch cases where an alternate spelling was used for the '[' or ']' tokens.


http://llvm-reviews.chandlerc.com/D50



More information about the cfe-commits mailing list