diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp index 8d5016250195fc31d1ecfbc01df9912939b4fc4c..5914322404ead2743030e51a2250f255ff17bdfa 100644 --- a/src/libs/cplusplus/FindUsages.cpp +++ b/src/libs/cplusplus/FindUsages.cpp @@ -221,7 +221,7 @@ bool FindUsages::visit(MemInitializerAST *ast) reportResult(simple->identifier_token, candidates); } } - accept(ast->expression); + accept(ast->expression_list); return false; } diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 1e6cae8969e49647a7e8580cea8707c73b4cbfe0..9df97aa16f804e955b17a72a19d23cf762e955b6 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -983,8 +983,8 @@ unsigned MemInitializerAST::lastToken() const { if (rparen_token) return rparen_token + 1; - else if (expression) - return expression->lastToken(); + else if (expression_list) + return expression_list->lastToken(); else if (lparen_token) return lparen_token + 1; return name->lastToken(); diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index d30858f0507242ceb67db4e36bd9071992e1b08f..559932843bbfd7148225792fea6ded19f2b2d573 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -1187,7 +1187,7 @@ class CPLUSPLUS_EXPORT MemInitializerAST: public AST public: NameAST *name; unsigned lparen_token; - ExpressionAST *expression; + ExpressionListAST *expression_list; unsigned rparen_token; public: diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp index ec31e0e3d98c6c77777df91d47ad2b2df922d680..47dac58232a99b0214f5c08a1abf5f7f1e2261b8 100644 --- a/src/shared/cplusplus/ASTMatcher.cpp +++ b/src/shared/cplusplus/ASTMatcher.cpp @@ -31,6 +31,7 @@ #include "ASTMatcher.h" #include "Control.h" #include "TranslationUnit.h" +#include "Literals.h" using namespace CPlusPlus; @@ -54,7 +55,7 @@ bool ASTMatcher::matchToken(unsigned tokenIndex, unsigned patternTokenIndex) con if (token.f.kind != otherToken.f.kind) return false; else if (token.is(T_IDENTIFIER)) { - if (token.identifier != otherToken.identifier) + if (! token.identifier->isEqualTo(otherToken.identifier)) return false; } return true; @@ -636,7 +637,7 @@ bool ASTMatcher::match(MemInitializerAST *node, MemInitializerAST *pattern) return false; if (! matchToken(node->lparen_token, pattern->lparen_token)) return false; - if (! AST::match(node->expression, pattern->expression, this)) + if (! AST::match(node->expression_list, pattern->expression_list, this)) return false; if (! matchToken(node->rparen_token, pattern->rparen_token)) return false; diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index 2d5d618ddae33aedcaab634b3c09d9ba7e50bcf2..6e26f772b2401b6b90bfb5e9e1181e76b9769c1c 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -420,7 +420,7 @@ void MemInitializerAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { accept(name, visitor); - accept(expression, visitor); + accept(expression_list, visitor); } visitor->endVisit(this); } diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 04ee291aef5e69dc5a58154bb7df122c6fbb10ee..d7d7029fa21a1d01dbf0f2b796cd0c4326597c26 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -356,7 +356,9 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast) bool CheckDeclaration::visit(MemInitializerAST *ast) { (void) semantic()->check(ast->name, _scope); - FullySpecifiedType ty = semantic()->check(ast->expression, _scope); + for (ExpressionListAST *it = ast->expression_list; it; it = it->next) { + FullySpecifiedType ty = semantic()->check(it->value, _scope); + } return false; } diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 36b7d03e1cf168295b113c7f54de799f252548df..5614355ab43993e87e786aced4ebb2d841c17a3a 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -1849,7 +1849,7 @@ bool Parser::parseMemInitializer(MemInitializerListAST *&node) MemInitializerAST *ast = new (_pool) MemInitializerAST; ast->name = name; ast->lparen_token = consumeToken(); - parseExpression(ast->expression); + parseExpressionList(ast->expression_list); if (LA() == T_RPAREN) ast->rparen_token = consumeToken(); @@ -1896,7 +1896,7 @@ bool Parser::parseExpressionList(ExpressionListAST *&node) while (LA() == T_COMMA) { consumeToken(); // consume T_COMMA - if (parseExpression(expression)) { + if (parseAssignmentExpression(expression)) { *expression_list_ptr = new (_pool) ExpressionListAST; (*expression_list_ptr)->value = expression; expression_list_ptr = &(*expression_list_ptr)->next; diff --git a/tests/manual/cplusplus/c++ b/tests/manual/cplusplus/c++ index f4cbb4fe5ca94388a0321b00ea72c0c19be583bf..a5908b79ff1a1a40498f2f94e25fb8872b707fdc 100755 --- a/tests/manual/cplusplus/c++ +++ b/tests/manual/cplusplus/c++ @@ -1,3 +1,5 @@ #!/bin/sh me=$(dirname $0) -${CPP-gcc} -xc++ -E -include $me/conf.c++ $* | $me/cplusplus0 +${CPP-gcc} -U__BLOCKS__ -xc++ -E -include $me/conf.c++ $* > $me/file.i +$me/cplusplus0 $me/file.i + diff --git a/tests/manual/cplusplus/conf.c++ b/tests/manual/cplusplus/conf.c++ index 3cec3f4693d3b2ff79e54fc42c9024a801481897..69bafe0459cce88f59249a01d65bff00f0615c25 100644 --- a/tests/manual/cplusplus/conf.c++ +++ b/tests/manual/cplusplus/conf.c++ @@ -6,7 +6,7 @@ #define restrict #define __restrict #define __restrict__ -#define __weak +// #define __weak #define __builtin_va_arg(a,b) ((b)0) #define __stdcall #define __fastcall diff --git a/tests/manual/cplusplus/cplusplus.pro b/tests/manual/cplusplus/cplusplus.pro index 11dd08f6fbdb90fce1efda55d15d6ae4f9f195be..4964d9c5ea7b48fa7ba2c0d447ccbebb4dbb2780 100644 --- a/tests/manual/cplusplus/cplusplus.pro +++ b/tests/manual/cplusplus/cplusplus.pro @@ -1,8 +1,8 @@ -QT = core +QT = core gui macx:CONFIG -= app_bundle TARGET = cplusplus0 -include(../../../src/shared/cplusplus/cplusplus.pri) +include(../../../src/libs/cplusplus/cplusplus-lib.pri) # Input SOURCES += main.cpp diff --git a/tests/manual/cplusplus/main.cpp b/tests/manual/cplusplus/main.cpp index 6c2596eeee152e33f61ec8306d3280a4ed26a368..a1054afee805edae9cbba331bef77e5079d15f68 100644 --- a/tests/manual/cplusplus/main.cpp +++ b/tests/manual/cplusplus/main.cpp @@ -38,6 +38,7 @@ #include <Symbols.h> #include <Names.h> #include <CoreTypes.h> +#include <CppDocument.h> #include <QFile> #include <QList> @@ -50,54 +51,62 @@ #include <cstdio> #include <cstdlib> #include <iostream> -#include <sstream> using namespace CPlusPlus; -int main(int argc, char *argv[]) +class ForEachBinaryExpression: protected ASTVisitor { - QCoreApplication app(argc, argv); + Document::Ptr doc; + Document::Ptr pattern; - QStringList args = app.arguments(); - const QString appName = args.first(); - args.removeFirst(); +public: + ForEachBinaryExpression(Document::Ptr doc, Document::Ptr pattern) + : ASTVisitor(doc->control()), doc(doc), pattern(pattern) {} - foreach (const QString &arg, args) { - if (arg == QLatin1String("--help")) { - const QFileInfo appInfo(appName); - const QByteArray appFileName = QFile::encodeName(appInfo.fileName()); + void operator()() { accept(doc->translationUnit()->ast()); } - printf("Usage: %s [options]\n" - " --help Display this information\n", - appFileName.constData()); +protected: + using ASTVisitor::visit; - return EXIT_SUCCESS; + virtual bool visit(BinaryExpressionAST *ast) + { + ASTMatcher matcher(doc->translationUnit(), pattern->translationUnit()); + + if (ast->match(ast, pattern->translationUnit()->ast(), &matcher)) { + translationUnit()->warning(ast->binary_op_token, "binary expression"); } + + return true; } +}; + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + + QStringList files = app.arguments(); + files.removeFirst(); + + Document::Ptr pattern = Document::create("<pattern>"); + pattern->setSource("__y < __x"); + pattern->parse(Document::ParseExpression); + + foreach (const QString &fileName, files) { + QFile file(fileName); + if (! file.open(QFile::ReadOnly)) + continue; + + const QByteArray source = file.readAll(); + file.close(); + + Document::Ptr doc = Document::create(fileName); + doc->control()->setDiagnosticClient(0); + doc->setSource(source); + doc->parse(); + + ForEachBinaryExpression forEachBinaryExpression(doc, pattern); - QFile in; - if (! in.open(stdin, QFile::ReadOnly)) - return EXIT_FAILURE; - - const QByteArray source = in.readAll(); - - Control control; - StringLiteral *fileId = control.findOrInsertStringLiteral("<stdin>"); - TranslationUnit unit(&control, fileId); - unit.setObjCEnabled(true); - unit.setSource(source.constData(), source.size()); - unit.parse(); - if (! unit.ast()) - return EXIT_FAILURE; - - TranslationUnitAST *ast = unit.ast()->asTranslationUnit(); - Q_ASSERT(ast != 0); - - Namespace *globalNamespace = control.newNamespace(0, 0); - Semantic sem(&control); - for (DeclarationListAST *it = ast->declaration_list; it; it = it->next) { - DeclarationAST *declaration = it->value; - sem.check(declaration, globalNamespace->members()); + forEachBinaryExpression(); } return EXIT_SUCCESS;