]> granicus.if.org Git - clang/commitdiff
[PreprocessingRecord] A macro expansion can be reported out-of-order in cases when
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 9 Jan 2013 23:22:20 +0000 (23:22 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 9 Jan 2013 23:22:20 +0000 (23:22 +0000)
there are macro expansions inside macro arguments where the arguments are
not expanded in the same order as listed; don't assert that all macro expansions
are in source order.

rdar://12397063

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172018 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/PreprocessingRecord.cpp
test/Preprocessor/pp-record.c

index 497af0b3dadb40b21262454d9057c3f8096cb372..8e8afeb4b7634942e8ee1b474a677175c545f19a 100644 (file)
@@ -244,11 +244,11 @@ PreprocessingRecord::addPreprocessedEntity(PreprocessedEntity *Entity) {
   assert(Entity);
   SourceLocation BeginLoc = Entity->getSourceRange().getBegin();
 
-  if (!isa<class InclusionDirective>(Entity)) {
+  if (isa<MacroDefinition>(Entity)) {
     assert((PreprocessedEntities.empty() ||
             !SourceMgr.isBeforeInTranslationUnit(BeginLoc,
                    PreprocessedEntities.back()->getSourceRange().getBegin())) &&
-           "a macro directive was encountered out-of-order");
+           "a macro definition was encountered out-of-order");
     PreprocessedEntities.push_back(Entity);
     return getPPEntityID(PreprocessedEntities.size()-1, /*isLoaded=*/false);
   }
@@ -263,7 +263,15 @@ PreprocessingRecord::addPreprocessedEntity(PreprocessedEntity *Entity) {
 
   // The entity's location is not after the previous one; this can happen with
   // include directives that form the filename using macros, e.g:
-  // "#include MACRO(STUFF)".
+  // "#include MACRO(STUFF)"
+  // or with macro expansions inside macro arguments where the arguments are
+  // not expanded in the same order as listed, e.g:
+  // \code
+  //  #define M1 1
+  //  #define M2 2
+  //  #define FM(x,y) y x
+  //  FM(M1, M2)
+  // \endcode
 
   typedef std::vector<PreprocessedEntity *>::iterator pp_iter;
 
index dd958d0e56d1966b2bf8fd5ef0b55b8e2320ebe7..92ca366e37f536f241a1df22a4d6e2cc0a1b18fb 100644 (file)
@@ -21,3 +21,8 @@ FNM(
     int b;
 #endif
 )
+
+#define M1 c
+#define M2 int
+#define FM2(x,y) y x
+FM2(M1, M2);