diff -r 000000000000 -r 1918ee327afb tests/auto/compilerwarnings/tst_compilerwarnings.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/compilerwarnings/tst_compilerwarnings.cpp Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,258 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include +#include +#include +#include + +#include + +#ifdef QT_NO_PROCESS +QTEST_NOOP_MAIN +#else + +#include + +QT_USE_NAMESPACE + +class tst_CompilerWarnings: public QObject +{ + Q_OBJECT + +private slots: + void warnings_data(); + void warnings(); +}; + +#if 0 +/* + Return list of all documented qfeatures (QT_NO_*) + */ +static QStringList getFeatures() +{ + QStringList srcDirs; + srcDirs << QString::fromLocal8Bit(qgetenv("QTDIR")) + << QString::fromLocal8Bit(qgetenv("QTSRCDIR")); + + QString featurefile; + foreach (QString dir, srcDirs) { + QString str = dir + "/src/corelib/global/qfeatures.txt"; + if (QFile::exists(str)) { + featurefile = str; + break; + } + } + + if (featurefile.isEmpty()) { + qWarning("Unable to find qfeatures.txt"); + return QStringList(); + } + + QFile file(featurefile); + if (!file.open(QIODevice::ReadOnly)) { + qWarning("Unable to open feature file '%s'", qPrintable(featurefile)); + return QStringList(); + } + + QStringList features; + QTextStream s(&file); + QRegExp regexp("Feature:\\s+(\\w+)\\s*"); + for (QString line = s.readLine(); !s.atEnd(); line = s.readLine()) { + if (regexp.exactMatch(line)) + features << regexp.cap(1); + } + + return features; +} +#endif + +void tst_CompilerWarnings::warnings_data() +{ + QTest::addColumn("cflags"); + + QTest::newRow("standard") << QStringList(); + +#if 0 +#ifdef Q_WS_QWS + QStringList features = getFeatures(); + foreach (QString feature, features) { + QStringList args; + QString macro = QString("QT_NO_%1").arg(feature); + args << (QString("-D%1").arg(macro)); + QTest::newRow(qPrintable(macro)) << args; + } +#endif +#endif +} + +void tst_CompilerWarnings::warnings() +{ + QFETCH(QStringList, cflags); + +#if !defined(Q_CC_INTEL) && defined(Q_CC_GNU) && __GNUC__ == 3 + QSKIP("gcc 3.x outputs too many bogus warnings", SkipAll); +#endif + + static QString tmpFile; + if (tmpFile.isEmpty()) { + QTemporaryFile tmpQFile; + tmpQFile.open(); + tmpFile = tmpQFile.fileName(); + tmpQFile.close(); + } + static QString tmpSourceFile; + bool openResult = true; + const QString tmpBaseName("XXXXXX-test.cpp"); + QString templatePath = QDir::temp().absoluteFilePath(tmpBaseName); + QFile tmpQSourceFile(templatePath); + if (tmpSourceFile.isEmpty()) { + tmpQSourceFile.open(QIODevice::ReadWrite | QIODevice::Truncate); + tmpSourceFile = tmpQSourceFile.fileName(); + QFile cppSource(":/test.cpp"); + bool openResult = cppSource.open(QIODevice::ReadOnly); + if (openResult) + { + QTextStream in(&cppSource); + QTextStream out(&tmpQSourceFile); + out << in.readAll(); + } + } + tmpQSourceFile.close(); + QVERIFY2(openResult, "Need resource temporary \"test.cpp\""); + + QStringList args; + QString compilerName; + + static QString qtDir = QString::fromLocal8Bit(qgetenv("QTDIR")); + QVERIFY2(!qtDir.isEmpty(), "This test needs $QTDIR"); + + args << cflags; +#if !defined(Q_CC_INTEL) && defined(Q_CC_GNU) + compilerName = "g++"; + args << "-I" + qtDir + "/include"; + args << "-I/usr/X11R6/include/"; +#ifdef Q_OS_HPUX + args << "-I/usr/local/mesa/aCC-64/include"; +#endif + args << "-c"; + args << "-Wall" << "-Wold-style-cast" << "-Woverloaded-virtual" << "-pedantic" << "-ansi" + << "-Wno-long-long" << "-Wshadow" << "-Wpacked" << "-Wunreachable-code" + << "-Wundef" << "-Wchar-subscripts" << "-Wformat-nonliteral" << "-Wformat-security" + << "-Wcast-align" + << "-o" << tmpFile + << tmpSourceFile; +#elif defined(Q_CC_XLC) + compilerName = "xlC_r"; + args << "-I" + qtDir + "/include" +# if QT_POINTER_SIZE == 8 + << "-q64" +# endif + << "-c" << "-o" << tmpFile + << "-info=all" + << tmpSourceFile; +#elif defined(Q_CC_MSVC) + compilerName = "cl"; + args << "-I" + qtDir + "/include" + << "-nologo" << "-W3" + << tmpSourceFile; +#elif defined (Q_CC_SUN) + compilerName = "CC"; + // +w or +w2 outputs too much bogus + args << "-I" + qtDir + "/include" +# if QT_POINTER_SIZE == 8 + << "-xarch=v9" +# endif + << "-o" << tmpFile + << tmpSourceFile; +#elif defined (Q_CC_HPACC) + compilerName = "aCC"; + args << "-I" + qtDir + "/include" + << "-I/usr/local/mesa/aCC-64/include" + << "-I/opt/graphics/OpenGL/include" +# if QT_POINTER_SIZE == 8 && !defined __ia64 + << "+DA2.0W" +# endif + // aCC generates too much bogus. + << "-DQT_NO_STL" << "-c" << "-w" + << "-o" << tmpFile + << tmpSourceFile; +#elif defined(Q_CC_MIPS) + compilerName = "CC"; + args << "-I" + qtDir + "/include" + << "-c" + << "-woff" << "3303" // const qualifier on return + << "-o" << tmpFile + << tmpSourceFile; +#else + QSKIP("Test not implemented for this compiler", SkipAll); +#endif + + QProcess proc; + proc.start(compilerName, args, QIODevice::ReadOnly); + QVERIFY2(proc.waitForFinished(6000000), proc.errorString().toLocal8Bit()); + +#ifdef Q_CC_MSVC + QString errs = QString::fromLocal8Bit(proc.readAllStandardOutput().constData()); + if (errs.startsWith(tmpBaseName)) + errs = errs.mid(tmpBaseName.size()).simplified();; +#else + QString errs = QString::fromLocal8Bit(proc.readAllStandardError().constData()); +#endif + QStringList errList; + if (!errs.isEmpty()) { + errList = errs.split("\n"); + qDebug() << "Arguments:" << args; + foreach (QString err, errList) { + qDebug() << err; + } + } + QCOMPARE(errList.count(), 0); // verbose info how many lines of errors in output + QVERIFY(errs.isEmpty()); + + tmpQSourceFile.remove(); +} + +QTEST_APPLESS_MAIN(tst_CompilerWarnings) + +#include "tst_compilerwarnings.moc" +#endif // QT_NO_PROCESS