diff --git a/tests/auto/cplusplus/ast/ast.pro b/tests/auto/cplusplus/ast/ast.pro
new file mode 100644
index 0000000000000000000000000000000000000000..6974c6bbb4c69f78c5816767bbcab9d083121ae2
--- /dev/null
+++ b/tests/auto/cplusplus/ast/ast.pro
@@ -0,0 +1,5 @@
+load(qttest_p4)
+include(../shared/shared.pri)
+QT = core
+
+SOURCES += tst_ast.cpp
diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..93ad454e563487cd19e4726cf54c1d31f43040c2
--- /dev/null
+++ b/tests/auto/cplusplus/ast/tst_ast.cpp
@@ -0,0 +1,73 @@
+
+#include <QtTest>
+#include <QtDebug>
+
+#include <Control.h>
+#include <Parser.h>
+#include <AST.h>
+
+CPLUSPLUS_USE_NAMESPACE
+
+class tst_AST: public QObject
+{
+    Q_OBJECT
+
+    Control control;
+
+public:
+    TranslationUnit *parse(const QByteArray &source,
+                           TranslationUnit::ParseMode mode)
+    {
+        StringLiteral *fileId = control.findOrInsertFileName("<stdin>");
+        TranslationUnit *unit = new TranslationUnit(&control, fileId);
+        unit->setSource(source.constData(), source.length());
+        unit->parse(mode);
+        return unit;
+    }
+
+    TranslationUnit *parseStatement(const QByteArray &source)
+    { return parse(source, TranslationUnit::ParseStatement); }
+
+private slots:
+    void if_statement();
+    void if_else_statement();
+};
+
+void tst_AST::if_statement()
+{
+    QSharedPointer<TranslationUnit> unit(parseStatement("if (a) b;"));
+
+    AST *ast = unit->ast();
+    QVERIFY(ast != 0);
+
+    IfStatementAST *stmt = ast->asIfStatement();
+    QVERIFY(stmt != 0);
+    QCOMPARE(stmt->if_token, 1U);
+    QCOMPARE(stmt->lparen_token, 2U);
+    QVERIFY(stmt->condition != 0);
+    QCOMPARE(stmt->rparen_token, 4U);
+    QVERIFY(stmt->statement != 0);
+    QCOMPARE(stmt->else_token, 0U);
+    QVERIFY(stmt->else_statement == 0);
+}
+
+void tst_AST::if_else_statement()
+{
+    QSharedPointer<TranslationUnit> unit(parseStatement("if (a) b; else c;"));
+
+    AST *ast = unit->ast();
+    QVERIFY(ast != 0);
+
+    IfStatementAST *stmt = ast->asIfStatement();
+    QVERIFY(stmt != 0);
+    QCOMPARE(stmt->if_token, 1U);
+    QCOMPARE(stmt->lparen_token, 2U);
+    QVERIFY(stmt->condition != 0);
+    QCOMPARE(stmt->rparen_token, 4U);
+    QVERIFY(stmt->statement != 0);
+    QCOMPARE(stmt->else_token, 7U);
+    QVERIFY(stmt->else_statement != 0);
+}
+
+QTEST_APPLESS_MAIN(tst_AST)
+#include "tst_ast.moc"
diff --git a/tests/auto/cplusplus/cplusplus.pro b/tests/auto/cplusplus/cplusplus.pro
new file mode 100644
index 0000000000000000000000000000000000000000..e661c5e4089574751435016cf05dd4b0bd3bc367
--- /dev/null
+++ b/tests/auto/cplusplus/cplusplus.pro
@@ -0,0 +1,2 @@
+SUBDIRS = shared ast
+CONFIG += ordered
diff --git a/tests/auto/cplusplus/shared/shared.pri b/tests/auto/cplusplus/shared/shared.pri
new file mode 100644
index 0000000000000000000000000000000000000000..bcb756ea34bdec219d05f0a1e9e8397bbab95959
--- /dev/null
+++ b/tests/auto/cplusplus/shared/shared.pri
@@ -0,0 +1,4 @@
+
+DEFINES += HAVE_QT CPLUSPLUS_WITH_NAMESPACE
+INCLUDEPATH += $$PWD/../../../../shared/cplusplus
+LIBS += -L$$PWD -lCPlusPlusTestSupport
diff --git a/tests/auto/cplusplus/shared/shared.pro b/tests/auto/cplusplus/shared/shared.pro
new file mode 100644
index 0000000000000000000000000000000000000000..94003e3447e5858930df128f9d7faa34cb1851d0
--- /dev/null
+++ b/tests/auto/cplusplus/shared/shared.pro
@@ -0,0 +1,8 @@
+
+TEMPLATE = lib
+TARGET = CPlusPlusTestSupport
+CONFIG += static
+QT = core
+
+DEFINES += HAVE_QT CPLUSPLUS_WITH_NAMESPACE
+include($$PWD/../../../../shared/cplusplus/cplusplus.pri)