diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 2fdcc6a9134..b9ffa9d10bc 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -817,7 +817,11 @@ bool CreateBindings::visit(Namespace *ns) for (unsigned i = 0; i < ns->memberCount(); ++i) process(ns->memberAt(i)); + if (ns->isInline() && previous) + previous->addUsing(_currentClassOrNamespace); + _currentClassOrNamespace = previous; + return false; } diff --git a/tests/auto/cplusplus/cplusplus.pro b/tests/auto/cplusplus/cplusplus.pro index 6e94ed407bf..6a7091a552d 100644 --- a/tests/auto/cplusplus/cplusplus.pro +++ b/tests/auto/cplusplus/cplusplus.pro @@ -10,5 +10,5 @@ SUBDIRS = \ semantic \ typeprettyprinter \ simplifytypes \ - misc - + misc \ + cxx11 diff --git a/tests/auto/cplusplus/cxx11/cxx11.pro b/tests/auto/cplusplus/cxx11/cxx11.pro new file mode 100644 index 00000000000..e2091b372fc --- /dev/null +++ b/tests/auto/cplusplus/cxx11/cxx11.pro @@ -0,0 +1,3 @@ +include(../../qttest.pri) +include(../shared/shared.pri) +SOURCES += tst_cxx11.cpp diff --git a/tests/auto/cplusplus/cxx11/data/inlineNamespace.1.cpp b/tests/auto/cplusplus/cxx11/data/inlineNamespace.1.cpp new file mode 100644 index 00000000000..9a8ecf59e11 --- /dev/null +++ b/tests/auto/cplusplus/cxx11/data/inlineNamespace.1.cpp @@ -0,0 +1,5 @@ + +inline namespace zoo { + void foo(); +} + diff --git a/tests/auto/cplusplus/cxx11/data/inlineNamespace.1.errors.txt b/tests/auto/cplusplus/cxx11/data/inlineNamespace.1.errors.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/auto/cplusplus/cxx11/tst_cxx11.cpp b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp new file mode 100644 index 00000000000..33d396d9f5e --- /dev/null +++ b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp @@ -0,0 +1,168 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** +** GNU Lesser General Public License Usage +** +** 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. +** +** Other Usage +** +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +**************************************************************************/ + +#include +#include +#include +#include +#include +#include + +//TESTED_COMPONENT=src/libs/cplusplus +using namespace CPlusPlus; + +#define VERIFY_ERRORS() \ + do { \ + QFile e(testdata(errorFile)); \ + QByteArray expectedErrors; \ + if (e.open(QFile::ReadOnly)) \ + expectedErrors = QTextStream(&e).readAll().toUtf8(); \ + QCOMPARE(errors, expectedErrors); \ + } while (0) + + +class tst_cxx11: public QObject +{ + Q_OBJECT + + /* + Returns the path to some testdata file or directory. + */ + static QString testdata(const QString &name = QString()) + { + static const QString dataDirectory = QDir::currentPath() + QLatin1String("/data"); + QString result = dataDirectory; + if (!name.isEmpty()) { + result += QLatin1Char('/'); + result += name; + } + return result; + } + + struct Client: CPlusPlus::DiagnosticClient { + QByteArray *errors; + + Client(QByteArray *errors) + : errors(errors) + { + } + + virtual void report(int level, + const StringLiteral *fileName, + unsigned line, unsigned column, + const char *format, va_list ap) + { + if (! errors) + return; + + static const char *const pretty[] = { "warning", "error", "fatal" }; + + QString str; + str.sprintf("%s:%d:%d: %s: ", fileName->chars(), line, column, pretty[level]); + errors->append(str.toUtf8()); + + str.vsprintf(format, ap); + errors->append(str.toUtf8()); + + errors->append('\n'); + } + }; + + Document::Ptr document(const QString &fileName, QByteArray *errors = 0) + { + Document::Ptr doc = Document::create(fileName); + QFile file(testdata(fileName)); + if (file.open(QFile::ReadOnly)) { + Client client(errors); + doc->control()->setDiagnosticClient(&client); + doc->setUtf8Source(QTextStream(&file).readAll().toUtf8()); + doc->translationUnit()->setCxxOxEnabled(true); + doc->check(); + doc->control()->setDiagnosticClient(0); + } + return doc; + } + +private Q_SLOTS: + // + // checks for the syntax + // + void inlineNamespace_data(); + void inlineNamespace(); + + // + // checks for the semantic + // + void inlineNamespaceLookup(); +}; + + +void tst_cxx11::inlineNamespace_data() +{ + QTest::addColumn("file"); + QTest::addColumn("errorFile"); + + QTest::newRow("inlineNamespace.1") << "inlineNamespace.1.cpp" << "inlineNamespace.1.errors.txt"; +} + +void tst_cxx11::inlineNamespace() +{ + QFETCH(QString, file); + QFETCH(QString, errorFile); + + QByteArray errors; + Document::Ptr doc = document(file, &errors); + + if (! qgetenv("DEBUG").isNull()) + printf("%s\n", errors.constData()); + + VERIFY_ERRORS(); +} + +// +// check the visibility of symbols declared inside inline namespaces +// +void tst_cxx11::inlineNamespaceLookup() +{ + Document::Ptr doc = document("inlineNamespace.1.cpp"); + Snapshot snapshot; + snapshot.insert(doc); + + LookupContext context(doc, snapshot); + QSharedPointer control = context.control(); + + QList results = context.lookup(control->identifier("foo"), doc->globalNamespace()); + QCOMPARE(results.size(), 1); // the symbol is visible from the global scope +} + +QTEST_APPLESS_MAIN(tst_cxx11) +#include "tst_cxx11.moc"