diff --git a/tests/manual/cplusplus/c++ b/tests/manual/cplusplus/c++
new file mode 100755
index 0000000000000000000000000000000000000000..f4cbb4fe5ca94388a0321b00ea72c0c19be583bf
--- /dev/null
+++ b/tests/manual/cplusplus/c++
@@ -0,0 +1,3 @@
+#!/bin/sh
+me=$(dirname $0)
+${CPP-gcc} -xc++ -E -include $me/conf.c++ $* | $me/cplusplus0
diff --git a/tests/manual/cplusplus/conf.c++ b/tests/manual/cplusplus/conf.c++
new file mode 100644
index 0000000000000000000000000000000000000000..fbfad57a4bc2157303aac6103ef7e15ca056e1d5
--- /dev/null
+++ b/tests/manual/cplusplus/conf.c++
@@ -0,0 +1,7 @@
+#define __extension__
+#define __context__
+#define __range__
+#define __asm(a...)
+#define __asm__(a...)
+#define   restrict
+#define __restrict
diff --git a/tests/manual/cplusplus/cplusplus.pro b/tests/manual/cplusplus/cplusplus.pro
new file mode 100644
index 0000000000000000000000000000000000000000..0d965b8ed0aea1f4eaf8a05cefda58e9ae033dad
--- /dev/null
+++ b/tests/manual/cplusplus/cplusplus.pro
@@ -0,0 +1,19 @@
+QT = core
+macx:CONFIG -= app_bundle
+TARGET = cplusplus0
+
+include(../../../shared/cplusplus/cplusplus.pri)
+
+# Input
+SOURCES += main.cpp
+
+unix {
+    debug:OBJECTS_DIR = $${OUT_PWD}/.obj/debug-shared
+    release:OBJECTS_DIR = $${OUT_PWD}/.obj/release-shared
+
+    debug:MOC_DIR = $${OUT_PWD}/.moc/debug-shared
+    release:MOC_DIR = $${OUT_PWD}/.moc/release-shared
+
+    RCC_DIR = $${OUT_PWD}/.rcc/
+    UI_DIR = $${OUT_PWD}/.uic/
+}
diff --git a/tests/manual/cplusplus/main.cpp b/tests/manual/cplusplus/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..18b89137a580f69f4af5a6b7fac9086b85b3aaa3
--- /dev/null
+++ b/tests/manual/cplusplus/main.cpp
@@ -0,0 +1,37 @@
+
+#include <QFile>
+
+#include <cstdio>
+#include <cstdlib>
+
+#include <TranslationUnit.h>
+#include <Control.h>
+#include <AST.h>
+#include <Semantic.h>
+#include <Scope.h>
+
+int main(int, char *[])
+{
+    Control control;
+    StringLiteral *fileId = control.findOrInsertFileName("<stdin>");
+
+    QFile in;
+    if (! in.open(stdin, QFile::ReadOnly))
+        return EXIT_FAILURE;
+
+    const QByteArray source = in.readAll();
+
+    TranslationUnit unit(&control, fileId);
+    unit.setSource(source.constData(), source.size());
+    unit.parse();
+
+    if (TranslationUnitAST *ast = unit.ast()) {
+        Scope globalScope;
+        Semantic sem(&control);
+        for (DeclarationAST *decl = ast->declarations; decl; decl = decl->next) {
+            sem.check(decl, &globalScope);
+        }
+    }
+
+    return EXIT_SUCCESS;
+}