[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdevelop] languages/cpp/parser: Make C macro variadic argument optional
From:       Alexandre Courbot <gnurou () gmail ! com>
Date:       2012-09-01 2:51:41
Message-ID: 20120901025141.E1425A6096 () git ! kde ! org
[Download RAW message or body]

Git commit 0e2715798125da2e022f4f26b381a782b442b964 by Alexandre Courbot.
Committed on 24/08/2012 at 11:41.
Pushed by courbot into branch 'master'.

Make C macro variadic argument optional

In GNU C, the variadic argument of a macro can be completely left out
without triggering an error (as explained in
http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html)

REVIEW: 105307.

M  +6    -4    languages/cpp/parser/rpp/pp-engine.cpp
M  +3    -0    languages/cpp/parser/tests/test_parser.cpp

http://commits.kde.org/kdevelop/0e2715798125da2e022f4f26b381a782b442b964

diff --git a/languages/cpp/parser/rpp/pp-engine.cpp \
b/languages/cpp/parser/rpp/pp-engine.cpp index ca566cb..09d0764 100644
--- a/languages/cpp/parser/rpp/pp-engine.cpp
+++ b/languages/cpp/parser/rpp/pp-engine.cpp
@@ -317,8 +317,6 @@ void pp::handle_define (Stream& input)
 
     skip_blanks (++input, devnull()); // skip '('
     uint formal = skip_identifier(input);
-    if (formal)
-      macro->formalsList().append( KDevelop::IndexedString::fromIndex(formal) );
 
     skip_blanks(input, devnull());
 
@@ -330,14 +328,15 @@ void pp::handle_define (Stream& input)
 
       } while (input == '.');
     }
+    if (formal && !macro->variadics)
+      macro->formalsList().append( KDevelop::IndexedString::fromIndex(formal) );
+
 
     while (!input.atEnd() && input == ',')
     {
       skip_blanks(++input, devnull());
 
       uint formal = skip_identifier(input);
-      if (formal)
-        macro->formalsList().append( KDevelop::IndexedString::fromIndex(formal) );
 
       skip_blanks (input, devnull());
 
@@ -349,6 +348,9 @@ void pp::handle_define (Stream& input)
 
         } while (input == '.');
       }
+
+      if (formal && !macro->variadics)
+        macro->formalsList().append( KDevelop::IndexedString::fromIndex(formal) );
     }
 
     RETURN_ON_FAIL(input == ')');
diff --git a/languages/cpp/parser/tests/test_parser.cpp \
b/languages/cpp/parser/tests/test_parser.cpp index 804f379..c145a10 100644
--- a/languages/cpp/parser/tests/test_parser.cpp
+++ b/languages/cpp/parser/tests/test_parser.cpp
@@ -519,6 +519,9 @@ void TestParser::testPreprocessor() {
   
   QEXPECT_FAIL("", "Variadic macros unsupported", Continue);
   QCOMPARE(preprocess("#define PUT_BETWEEN(x,y) x y x\n#define NC(...) \
__VA_ARGS__\nPUT_BETWEEN(NC(pair<a,b>), c)\n").replace(QRegExp("[\n\t ]+"), " \
").trimmed(), QString("pair<a,b> c pair<a,b>")); +
+  QEXPECT_FAIL("", "Variadic arguments cannot be left empty (GCC extension)", \
Continue); +  QCOMPARE(preprocess("#define NC(x,y...) x \
y\nNC(kde,ve)\nNC(lop)").replace(QRegExp("[\n\t ]+"), ""), QString("kdevelop"));  
   QEXPECT_FAIL("", "No problems reported for missmatching macro-parameter-lists", \
Continue);  QCOMPARE(preprocess("#define bla(x,y)\nbla(1,2,3)\n"), \
QString("*ERROR*"));


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic