From 3988ad95f757f7531e8133a10e83f74ab0ce1b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Tue, 12 Feb 2013 16:36:40 +0100 Subject: moc: Error out when detecting unterminated macro usage Exhausting the symbol list while looking for the final right parenthesis means it is missing. Task-number: QTBUG-29308 Change-Id: Iccf5897b0f5eb719699fd12d6c8e4a16ff189d9b Reviewed-by: Simon Hausmann --- src/tools/moc/preprocessor.cpp | 2 + tests/auto/tools/moc/tst_moc.cpp | 21 +++++++++ tests/auto/tools/moc/unterminated-function-macro.h | 51 ++++++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 tests/auto/tools/moc/unterminated-function-macro.h diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp index 7430c4a86c..96b920b7cd 100644 --- a/src/tools/moc/preprocessor.cpp +++ b/src/tools/moc/preprocessor.cpp @@ -630,6 +630,8 @@ Symbols Preprocessor::macroExpandIdentifier(Preprocessor *that, SymbolStack &sym if (nesting < 0) break; + else if (!symbols.hasNext()) + that->error("missing ')' in macro usage"); } // empty VA_ARGS diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index 8d180ce20b..af77e5c3ad 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -558,6 +558,7 @@ private slots: void autoSignalSpyMetaTypeRegistration(); void parseDefines(); void preprocessorOnly(); + void unterminatedFunctionMacro(); signals: void sigWithUnsignedArg(unsigned foo); @@ -2948,6 +2949,26 @@ void tst_Moc::preprocessorOnly() #endif } + +void tst_Moc::unterminatedFunctionMacro() +{ +#ifdef MOC_CROSS_COMPILED + QSKIP("Not tested when cross-compiled"); +#endif +#if defined(Q_OS_LINUX) && defined(Q_CC_GNU) && !defined(QT_NO_PROCESS) + QProcess proc; + proc.start("moc", QStringList() << "-E" << m_sourceDirectory + QStringLiteral("/unterminated-function-macro.h")); + QVERIFY(proc.waitForFinished()); + QCOMPARE(proc.exitCode(), 1); + QCOMPARE(proc.readAllStandardOutput(), QByteArray()); + QByteArray errorOutput = proc.readAllStandardError(); + QVERIFY(!errorOutput.isEmpty()); + QVERIFY(errorOutput.contains("missing ')' in macro usage")); +#else + QSKIP("Only tested on linux/gcc"); +#endif +} + QTEST_MAIN(tst_Moc) #include "tst_moc.moc" diff --git a/tests/auto/tools/moc/unterminated-function-macro.h b/tests/auto/tools/moc/unterminated-function-macro.h new file mode 100644 index 0000000000..813d60f0e4 --- /dev/null +++ b/tests/auto/tools/moc/unterminated-function-macro.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +class Dummy : public QObject { + Q_OBJECT +} + +#define MACRO(arg) do_something(arg) + +static void foo() { + MACRO(foo +} + -- cgit v1.2.3