[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