| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | /****************************************************************************
 | 
					
						
							| 
									
										
										
										
											2011-02-18 14:48:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2014-01-07 13:27:11 +01:00
										 |  |  | ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** Contact: http://www.qt-project.org/legal
 | 
					
						
							| 
									
										
										
										
											2011-02-18 14:48:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** This file is part of Qt Creator. | 
					
						
							| 
									
										
										
										
											2011-02-18 14:48:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** 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.
 | 
					
						
							| 
									
										
										
										
											2011-02-18 14:48:16 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** 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 | 
					
						
							| 
									
										
										
										
											2011-02-18 14:48:16 +01:00
										 |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <QtTest>
 | 
					
						
							| 
									
										
										
										
											2012-08-06 13:42:46 +02:00
										 |  |  | #include <QDebug>
 | 
					
						
							| 
									
										
										
										
											2009-10-26 15:07:00 +01:00
										 |  |  | #include <QTextDocument>
 | 
					
						
							|  |  |  | #include <QTextCursor>
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-27 18:54:03 +01:00
										 |  |  | #include <cplusplus/AST.h>
 | 
					
						
							|  |  |  | #include <cplusplus/ASTVisitor.h>
 | 
					
						
							|  |  |  | #include <cplusplus/Bind.h>
 | 
					
						
							|  |  |  | #include <cplusplus/Control.h>
 | 
					
						
							|  |  |  | #include <cplusplus/CoreTypes.h>
 | 
					
						
							|  |  |  | #include <cplusplus/DeprecatedGenTemplateInstance.h>
 | 
					
						
							|  |  |  | #include <cplusplus/DiagnosticClient.h>
 | 
					
						
							|  |  |  | #include <cplusplus/ExpressionUnderCursor.h>
 | 
					
						
							|  |  |  | #include <cplusplus/Literals.h>
 | 
					
						
							|  |  |  | #include <cplusplus/Names.h>
 | 
					
						
							|  |  |  | #include <cplusplus/Names.h>
 | 
					
						
							|  |  |  | #include <cplusplus/Overview.h>
 | 
					
						
							|  |  |  | #include <cplusplus/Parser.h>
 | 
					
						
							|  |  |  | #include <cplusplus/Scope.h>
 | 
					
						
							|  |  |  | #include <cplusplus/Symbols.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-02 15:32:04 +10:00
										 |  |  | //TESTED_COMPONENT=src/libs/cplusplus
 | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define NO_PARSER_OR_SEMANTIC_ERROR_MESSAGES
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 11:21:25 +02:00
										 |  |  | using namespace CPlusPlus; | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class tst_Semantic: public QObject | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Q_OBJECT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |     QSharedPointer<Control> control; | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     tst_Semantic() | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |         : control(new Control) | 
					
						
							|  |  |  |     { control->setDiagnosticClient(&diag); } | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     TranslationUnit *parse(const QByteArray &source, | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |                            TranslationUnit::ParseMode mode, | 
					
						
							| 
									
										
										
										
											2013-10-06 02:41:22 +02:00
										 |  |  |                            LanguageFeatures features) | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-08-11 15:48:21 +02:00
										 |  |  |         const StringLiteral *fileId = control->stringLiteral("<stdin>"); | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |         TranslationUnit *unit = new TranslationUnit(control.data(), fileId); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         unit->setSource(source.constData(), source.length()); | 
					
						
							| 
									
										
										
										
											2013-10-06 02:41:22 +02:00
										 |  |  |         unit->setLanguageFeatures(features); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         unit->parse(mode); | 
					
						
							|  |  |  |         return unit; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class Document { | 
					
						
							|  |  |  |         Q_DISABLE_COPY(Document) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         Document(TranslationUnit *unit) | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  |             : unit(unit) | 
					
						
							|  |  |  |             , globals(unit->control()->newNamespace(0, 0)) | 
					
						
							|  |  |  |             , errorCount(0) | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         { } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ~Document() | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |         { } | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         void check() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QVERIFY(unit); | 
					
						
							|  |  |  |             QVERIFY(unit->ast()); | 
					
						
							| 
									
										
										
										
											2010-08-13 16:22:25 +02:00
										 |  |  |             Bind bind(unit); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |             TranslationUnitAST *ast = unit->ast()->asTranslationUnit(); | 
					
						
							|  |  |  |             QVERIFY(ast); | 
					
						
							| 
									
										
										
										
											2010-08-13 16:22:25 +02:00
										 |  |  |             bind(ast, globals); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         TranslationUnit *unit; | 
					
						
							| 
									
										
										
										
											2010-08-13 16:22:25 +02:00
										 |  |  |         Namespace *globals; | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |         unsigned errorCount; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class Diagnostic: public DiagnosticClient { | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         int errorCount; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Diagnostic() | 
					
						
							|  |  |  |             : errorCount(0) | 
					
						
							|  |  |  |         { } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |         virtual void report(int /*level*/, | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  |                             const StringLiteral *fileName, | 
					
						
							|  |  |  |                             unsigned line, unsigned column, | 
					
						
							|  |  |  |                             const char *format, va_list ap) | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             ++errorCount; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  | #ifndef NO_PARSER_OR_SEMANTIC_ERROR_MESSAGES
 | 
					
						
							|  |  |  |             qDebug() << fileName->chars()<<':'<<line<<':'<<column<<' '<<QString().vsprintf(format, ap); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |             Q_UNUSED(fileName); | 
					
						
							|  |  |  |             Q_UNUSED(line); | 
					
						
							|  |  |  |             Q_UNUSED(column); | 
					
						
							|  |  |  |             Q_UNUSED(format); | 
					
						
							|  |  |  |             Q_UNUSED(ap); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     Diagnostic diag; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  |     QSharedPointer<Document> document(const QByteArray &source, bool enableObjc = false, bool qtMocRun = false, bool enableCxx11 = false) | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-10-06 02:41:22 +02:00
										 |  |  |         LanguageFeatures features; | 
					
						
							|  |  |  |         features.objCEnabled = enableObjc; | 
					
						
							|  |  |  |         features.qtEnabled = qtMocRun; | 
					
						
							|  |  |  |         features.qtMocRunEnabled = qtMocRun; | 
					
						
							|  |  |  |         features.qtKeywordsEnabled = qtMocRun; | 
					
						
							|  |  |  |         features.cxx11Enabled = enableCxx11; | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |         diag.errorCount = 0; // reset the error count.
 | 
					
						
							| 
									
										
										
										
											2013-10-06 02:41:22 +02:00
										 |  |  |         TranslationUnit *unit = parse(source, TranslationUnit::ParseTranlationUnit, features); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         QSharedPointer<Document> doc(new Document(unit)); | 
					
						
							|  |  |  |         doc->check(); | 
					
						
							| 
									
										
										
										
											2008-12-30 11:16:45 +01:00
										 |  |  |         doc->errorCount = diag.errorCount; | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         return doc; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private slots: | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     void function_declaration_1(); | 
					
						
							|  |  |  |     void function_declaration_2(); | 
					
						
							|  |  |  |     void function_definition_1(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     void nested_class_1(); | 
					
						
							| 
									
										
										
										
											2013-05-30 12:40:08 +02:00
										 |  |  |     void alias_declaration_1(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  |     void typedef_1(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  |     void typedef_2(); | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  |     void typedef_3(); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  |     void const_1(); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  |     void const_2(); | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  |     void pointer_to_function_1(); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     void template_instance_1(); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:07:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     void expression_under_cursor_1(); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     void bracketed_expression_under_cursor_1(); | 
					
						
							|  |  |  |     void bracketed_expression_under_cursor_2(); | 
					
						
							|  |  |  |     void bracketed_expression_under_cursor_3(); | 
					
						
							|  |  |  |     void bracketed_expression_under_cursor_4(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |     void objcClass_1(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     void objcSelector_1(); | 
					
						
							|  |  |  |     void objcSelector_2(); | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     void q_enum_1(); | 
					
						
							| 
									
										
										
										
											2011-02-17 16:59:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  |     void lambda_1(); | 
					
						
							| 
									
										
										
										
											2013-03-13 13:04:54 +01:00
										 |  |  |     void lambda_2(); | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 16:59:35 +01:00
										 |  |  |     void diagnostic_error(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | void tst_Semantic::function_declaration_1() | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("void foo();"); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     FullySpecifiedType declTy = decl->type(); | 
					
						
							| 
									
										
										
										
											2009-02-09 17:56:17 +01:00
										 |  |  |     Function *funTy = declTy->asFunctionType(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     QVERIFY(funTy); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isVoidType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 0U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QVERIFY(decl->name()->isNameId()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *funId = decl->name()->asNameId()->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     QVERIFY(funId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QByteArray foo(funId->chars(), funId->size()); | 
					
						
							|  |  |  |     QCOMPARE(foo, QByteArray("foo")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | void tst_Semantic::function_declaration_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("void foo(const QString &s);"); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     FullySpecifiedType declTy = decl->type(); | 
					
						
							| 
									
										
										
										
											2009-02-09 17:56:17 +01:00
										 |  |  |     Function *funTy = declTy->asFunctionType(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(funTy); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isVoidType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 1U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // check the formal argument.
 | 
					
						
							|  |  |  |     Argument *arg = funTy->argumentAt(0)->asArgument(); | 
					
						
							|  |  |  |     QVERIFY(arg); | 
					
						
							|  |  |  |     QVERIFY(arg->name()); | 
					
						
							|  |  |  |     QVERIFY(! arg->hasInitializer()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // check the argument's name.
 | 
					
						
							| 
									
										
										
										
											2010-09-02 11:59:01 +02:00
										 |  |  |     const Identifier *argNameId = arg->name()->asNameId(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(argNameId); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *argId = argNameId->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(argId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(QByteArray(argId->chars(), argId->size()), QByteArray("s")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // check the type of the formal argument
 | 
					
						
							|  |  |  |     FullySpecifiedType argTy = arg->type(); | 
					
						
							|  |  |  |     QVERIFY(argTy->isReferenceType()); | 
					
						
							|  |  |  |     QVERIFY(argTy->asReferenceType()->elementType().isConst()); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:59:22 +01:00
										 |  |  |     NamedType *namedTy = argTy->asReferenceType()->elementType()->asNamedType(); | 
					
						
							|  |  |  |     QVERIFY(namedTy); | 
					
						
							|  |  |  |     QVERIFY(namedTy->name()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *namedTypeId = namedTy->name()->asNameId()->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:59:22 +01:00
										 |  |  |     QVERIFY(namedTypeId); | 
					
						
							|  |  |  |     QCOMPARE(QByteArray(namedTypeId->chars(), namedTypeId->size()), | 
					
						
							|  |  |  |              QByteArray("QString")); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QVERIFY(decl->name()->isNameId()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *funId = decl->name()->asNameId()->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(funId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QByteArray foo(funId->chars(), funId->size()); | 
					
						
							|  |  |  |     QCOMPARE(foo, QByteArray("foo")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::function_definition_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("void foo() {}"); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Function *funTy = doc->globals->memberAt(0)->asFunction(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(funTy); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isVoidType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 0U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QVERIFY(funTy->name()->isNameId()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *funId = funTy->name()->asNameId()->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(funId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QByteArray foo(funId->chars(), funId->size()); | 
					
						
							|  |  |  |     QCOMPARE(foo, QByteArray("foo")); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  | void tst_Semantic::nested_class_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  | "class Object {\n" | 
					
						
							|  |  |  | "    class Data;\n" | 
					
						
							|  |  |  | "    Data *d;\n" | 
					
						
							|  |  |  | "};\n" | 
					
						
							|  |  |  | "class Object::Data {\n" | 
					
						
							|  |  |  | "   Object *q;\n" | 
					
						
							|  |  |  | "};\n" | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 2U); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *classObject = doc->globals->memberAt(0)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QVERIFY(classObject); | 
					
						
							|  |  |  |     QVERIFY(classObject->name()); | 
					
						
							| 
									
										
										
										
											2010-09-02 11:59:01 +02:00
										 |  |  |     const Identifier *classObjectNameId = classObject->name()->asNameId(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QVERIFY(classObjectNameId); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *objectId = classObjectNameId->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QCOMPARE(QByteArray(objectId->chars(), objectId->size()), QByteArray("Object")); | 
					
						
							|  |  |  |     QCOMPARE(classObject->baseClassCount(), 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(classObject->memberCount(), 2U); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *classObjectData = doc->globals->memberAt(1)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QVERIFY(classObjectData); | 
					
						
							|  |  |  |     QVERIFY(classObjectData->name()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const QualifiedNameId *q = classObjectData->name()->asQualifiedNameId(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QVERIFY(q); | 
					
						
							| 
									
										
										
										
											2010-07-12 16:18:52 +02:00
										 |  |  |     QVERIFY(q->base()); | 
					
						
							|  |  |  |     QVERIFY(q->base()->asNameId()); | 
					
						
							|  |  |  |     QCOMPARE(q->base(), classObject->name()); | 
					
						
							|  |  |  |     QVERIFY(q->name()); | 
					
						
							|  |  |  |     QVERIFY(q->name()->asNameId()); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->find(q->base()->asNameId()->identifier()), classObject); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Declaration *decl = classObjectData->memberAt(0)->asDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  |     PointerType *ptrTy = decl->type()->asPointerType(); | 
					
						
							|  |  |  |     QVERIFY(ptrTy); | 
					
						
							|  |  |  |     NamedType *namedTy = ptrTy->elementType()->asNamedType(); | 
					
						
							|  |  |  |     QVERIFY(namedTy); | 
					
						
							|  |  |  |     QVERIFY(namedTy->name()->asNameId()); | 
					
						
							|  |  |  |     QCOMPARE(namedTy->name()->asNameId()->identifier(), objectId); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-30 12:40:08 +02:00
										 |  |  | void tst_Semantic::alias_declaration_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  |                 "using wobble = int;\n" | 
					
						
							|  |  |  |                 , false, false, true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							|  |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(decl->name()); | 
					
						
							|  |  |  |     QVERIFY(decl->name()->identifier()); | 
					
						
							|  |  |  |     QCOMPARE(decl->name()->identifier()->chars(), "wobble"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QVERIFY(decl->isTypedef()); | 
					
						
							|  |  |  |     QVERIFY(decl->type().isTypedef()); | 
					
						
							|  |  |  |     QVERIFY(decl->type()->isIntegerType()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  | void tst_Semantic::typedef_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  | "typedef struct {\n" | 
					
						
							|  |  |  | "   int x, y;\n" | 
					
						
							|  |  |  | "} Point;\n" | 
					
						
							|  |  |  | "int main() {\n" | 
					
						
							|  |  |  | "   Point pt;\n" | 
					
						
							|  |  |  | "   pt.x = 1;\n" | 
					
						
							|  |  |  | "}\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 3U); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *anonStruct = doc->globals->memberAt(0)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  |     QVERIFY(anonStruct); | 
					
						
							|  |  |  |     QCOMPARE(anonStruct->memberCount(), 2U); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *typedefPointDecl = doc->globals->memberAt(1)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  |     QVERIFY(typedefPointDecl); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->isTypedef()); | 
					
						
							| 
									
										
										
										
											2009-02-09 17:56:17 +01:00
										 |  |  |     QCOMPARE(typedefPointDecl->type()->asClassType(), anonStruct); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Function *mainFun = doc->globals->memberAt(2)->asFunction(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  |     QVERIFY(mainFun); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  | void tst_Semantic::typedef_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  | "struct _Point {\n" | 
					
						
							|  |  |  | "   int x, y;\n" | 
					
						
							|  |  |  | "};\n" | 
					
						
							|  |  |  | "typedef _Point Point;\n" | 
					
						
							|  |  |  | "int main() {\n" | 
					
						
							|  |  |  | "   Point pt;\n" | 
					
						
							|  |  |  | "   pt.x = 1;\n" | 
					
						
							|  |  |  | "}\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 3U); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *_pointStruct= doc->globals->memberAt(0)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  |     QVERIFY(_pointStruct); | 
					
						
							|  |  |  |     QCOMPARE(_pointStruct->memberCount(), 2U); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *typedefPointDecl = doc->globals->memberAt(1)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  |     QVERIFY(typedefPointDecl); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->isTypedef()); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->type()->isNamedType()); | 
					
						
							|  |  |  |     QCOMPARE(typedefPointDecl->type()->asNamedType()->name(), _pointStruct->name()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Function *mainFun = doc->globals->memberAt(2)->asFunction(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  |     QVERIFY(mainFun); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  | void tst_Semantic::typedef_3() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  | "typedef struct {\n" | 
					
						
							|  |  |  | "   int x, y;\n" | 
					
						
							|  |  |  | "} *PointPtr;\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 2U); | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *_pointStruct= doc->globals->memberAt(0)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  |     QVERIFY(_pointStruct); | 
					
						
							|  |  |  |     QCOMPARE(_pointStruct->memberCount(), 2U); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *typedefPointDecl = doc->globals->memberAt(1)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  |     QVERIFY(typedefPointDecl); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->isTypedef()); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->type()->isPointerType()); | 
					
						
							| 
									
										
										
										
											2009-02-09 17:56:17 +01:00
										 |  |  |     QCOMPARE(typedefPointDecl->type()->asPointerType()->elementType()->asClassType(), | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  |              _pointStruct); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  | void tst_Semantic::const_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  | "int foo(const int *s);\n" | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  |     QVERIFY(decl->type()->isFunctionType()); | 
					
						
							|  |  |  |     Function *funTy = decl->type()->asFunctionType(); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isIntegerType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 1U); | 
					
						
							|  |  |  |     Argument *arg = funTy->argumentAt(0)->asArgument(); | 
					
						
							|  |  |  |     QVERIFY(arg); | 
					
						
							|  |  |  |     QVERIFY(! arg->type().isConst()); | 
					
						
							|  |  |  |     QVERIFY(arg->type()->isPointerType()); | 
					
						
							|  |  |  |     QVERIFY(arg->type()->asPointerType()->elementType().isConst()); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  |     QVERIFY(arg->type()->asPointerType()->elementType()->isIntegerType()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::const_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  | "int foo(char * const s);\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  |     QVERIFY(decl->type()->isFunctionType()); | 
					
						
							|  |  |  |     Function *funTy = decl->type()->asFunctionType(); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isIntegerType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 1U); | 
					
						
							|  |  |  |     Argument *arg = funTy->argumentAt(0)->asArgument(); | 
					
						
							|  |  |  |     QVERIFY(arg); | 
					
						
							|  |  |  |     QVERIFY(arg->type().isConst()); | 
					
						
							|  |  |  |     QVERIFY(arg->type()->isPointerType()); | 
					
						
							|  |  |  |     QVERIFY(! arg->type()->asPointerType()->elementType().isConst()); | 
					
						
							|  |  |  |     QVERIFY(arg->type()->asPointerType()->elementType()->isIntegerType()); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  | void tst_Semantic::pointer_to_function_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("void (*QtSomething)();"); | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PointerType *ptrTy = decl->type()->asPointerType(); | 
					
						
							|  |  |  |     QVERIFY(ptrTy); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Function *funTy = ptrTy->elementType()->asFunctionType(); | 
					
						
							|  |  |  |     QVERIFY(funTy); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-26 14:45:58 +01:00
										 |  |  |     QEXPECT_FAIL("", "Requires initialize enclosing scope of pointer-to-function symbols", Continue); | 
					
						
							| 
									
										
										
										
											2010-08-26 16:16:22 +02:00
										 |  |  |     QVERIFY(funTy->enclosingScope()); | 
					
						
							| 
									
										
										
										
											2009-10-26 14:45:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QEXPECT_FAIL("", "Requires initialize enclosing scope of pointer-to-function symbols", Continue); | 
					
						
							| 
									
										
										
										
											2010-08-26 16:16:22 +02:00
										 |  |  |     QCOMPARE(funTy->enclosingScope(), decl->enclosingScope()); | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | void tst_Semantic::template_instance_1() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-18 10:33:35 +02:00
										 |  |  |     QSharedPointer<Document> doc = document("template <typename _Tp> class QList { void append(const _Tp &value); };"); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Template *templ = doc->globals->memberAt(0)->asTemplate(); | 
					
						
							|  |  |  |     QVERIFY(templ); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = templ->memberAt(1)->asClass()->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |     FullySpecifiedType templArgs[] = { control->integerType(IntegerType::Int) }; | 
					
						
							| 
									
										
										
										
											2013-01-12 22:05:41 +01:00
										 |  |  |     const Name *templId = control->templateNameId(control->identifier("QList"), false, templArgs, 1); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |     FullySpecifiedType genTy = DeprecatedGenTemplateInstance::instantiate(templId, decl, control); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Overview oo; | 
					
						
							| 
									
										
										
										
											2012-10-23 10:50:38 +02:00
										 |  |  |     oo.showReturnTypes = true; | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const QString genDecl = oo.prettyType(genTy); | 
					
						
							| 
									
										
										
										
											2010-05-18 10:33:35 +02:00
										 |  |  |     QCOMPARE(genDecl, QString::fromLatin1("void (const int &)")); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-26 15:07:00 +01:00
										 |  |  | void tst_Semantic::expression_under_cursor_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "void *ptr = foo(10, bar"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-10-26 15:07:00 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, QString("bar")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  | void tst_Semantic::bracketed_expression_under_cursor_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "int i = 0, j[1], k = j[i"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, QString("i")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::bracketed_expression_under_cursor_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "[receiver msg"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, plainText); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::bracketed_expression_under_cursor_3() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "if ([receiver message"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, QString("[receiver message")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-12 16:18:52 +02:00
										 |  |  | void tst_Semantic::bracketed_expression_under_cursor_4() | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "int i = 0, j[1], k = j[(i == 0) ? 0 : i"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, QString("i")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  | void tst_Semantic::objcClass_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "@interface Zoo {} +(id)alloc;-(id)init;@end\n" | 
					
						
							|  |  |  |                                             "@implementation Zoo\n" | 
					
						
							|  |  |  |                                             "+(id)alloc{}\n" | 
					
						
							|  |  |  |                                             "-(id)init{}\n" | 
					
						
							|  |  |  |                                             "-(void)dealloc{}\n" | 
					
						
							|  |  |  |                                             "@end\n", | 
					
						
							|  |  |  |                                             true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 2U); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     ObjCClass *iface = doc->globals->memberAt(0)->asObjCClass(); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |     QVERIFY(iface); | 
					
						
							|  |  |  |     QVERIFY(iface->isInterface()); | 
					
						
							|  |  |  |     QCOMPARE(iface->memberCount(), 2U); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     ObjCClass *impl = doc->globals->memberAt(1)->asObjCClass(); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |     QVERIFY(impl); | 
					
						
							|  |  |  |     QVERIFY(!impl->isInterface()); | 
					
						
							|  |  |  |     QCOMPARE(impl->memberCount(), 3U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ObjCMethod *allocMethod = impl->memberAt(0)->asObjCMethod(); | 
					
						
							|  |  |  |     QVERIFY(allocMethod); | 
					
						
							|  |  |  |     QVERIFY(allocMethod->name() && allocMethod->name()->identifier()); | 
					
						
							|  |  |  |     QCOMPARE(QLatin1String(allocMethod->name()->identifier()->chars()), QLatin1String("alloc")); | 
					
						
							|  |  |  |     QVERIFY(allocMethod->isStatic()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ObjCMethod *deallocMethod = impl->memberAt(2)->asObjCMethod(); | 
					
						
							|  |  |  |     QVERIFY(deallocMethod); | 
					
						
							|  |  |  |     QVERIFY(deallocMethod->name() && deallocMethod->name()->identifier()); | 
					
						
							|  |  |  |     QCOMPARE(QLatin1String(deallocMethod->name()->identifier()->chars()), QLatin1String("dealloc")); | 
					
						
							|  |  |  |     QVERIFY(!deallocMethod->isStatic()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | void tst_Semantic::objcSelector_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "@interface A {}\n" | 
					
						
							| 
									
										
										
										
											2010-08-13 16:52:59 +02:00
										 |  |  |                                             "-(void) a:(int)a    b:(int)b c:(int)c;\n" | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |                                             "@end\n", | 
					
						
							|  |  |  |                                             true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     ObjCClass *iface = doc->globals->memberAt(0)->asObjCClass(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     QVERIFY(iface); | 
					
						
							|  |  |  |     QVERIFY(iface->isInterface()); | 
					
						
							|  |  |  |     QCOMPARE(iface->memberCount(), 1U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Declaration *decl = iface->memberAt(0)->asDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  |     QVERIFY(decl->name()); | 
					
						
							|  |  |  |     const SelectorNameId *selId = decl->name()->asSelectorNameId(); | 
					
						
							|  |  |  |     QVERIFY(selId); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameCount(), 3U); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(0)->identifier()->chars(), "a"); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(1)->identifier()->chars(), "b"); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(2)->identifier()->chars(), "c"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CollectSelectors: public ASTVisitor | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     CollectSelectors(TranslationUnit *xUnit): ASTVisitor(xUnit) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QList<ObjCSelectorAST *> operator()() { | 
					
						
							|  |  |  |         selectors.clear(); | 
					
						
							|  |  |  |         accept(translationUnit()->ast()); | 
					
						
							|  |  |  |         return selectors; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-23 17:43:40 +01:00
										 |  |  |     virtual bool visit(ObjCSelectorAST *ast) {selectors.append(ast); return false;} | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     QList<ObjCSelectorAST *> selectors; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::objcSelector_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "@implementation A {}\n" | 
					
						
							|  |  |  |                                             "-(SEL)x {\n" | 
					
						
							|  |  |  |                                             "  return @selector(a:b:c:);\n" | 
					
						
							|  |  |  |                                             "}\n" | 
					
						
							|  |  |  |                                             "@end\n", | 
					
						
							|  |  |  |                                             true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     ObjCClass *iface = doc->globals->memberAt(0)->asObjCClass(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     QVERIFY(iface); | 
					
						
							|  |  |  |     QCOMPARE(iface->memberCount(), 1U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QList<ObjCSelectorAST*>selectors = CollectSelectors(doc->unit)(); | 
					
						
							|  |  |  |     QCOMPARE(selectors.size(), 2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-23 17:43:40 +01:00
										 |  |  |     ObjCSelectorAST *sel = selectors.at(1)->asObjCSelector(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     QVERIFY(sel); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-23 17:43:40 +01:00
										 |  |  |     const SelectorNameId *selId = sel->name->asSelectorNameId(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     QVERIFY(selId); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameCount(), 3U); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(0)->identifier()->chars(), "a"); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(1)->identifier()->chars(), "b"); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(2)->identifier()->chars(), "c"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  | void tst_Semantic::q_enum_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "class Tst {\n" | 
					
						
							|  |  |  |                                             "Q_ENUMS(e)\n" | 
					
						
							|  |  |  |                                             "public:\n" | 
					
						
							|  |  |  |                                             "enum e { x, y };\n" | 
					
						
							|  |  |  |                                             "};\n", | 
					
						
							|  |  |  |                                             false, true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  |     QVERIFY(doc->unit); | 
					
						
							|  |  |  |     TranslationUnitAST *xUnit = doc->unit->ast()->asTranslationUnit(); | 
					
						
							|  |  |  |     QVERIFY(xUnit); | 
					
						
							|  |  |  |     SimpleDeclarationAST *tstDecl = xUnit->declaration_list->value->asSimpleDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(tstDecl); | 
					
						
							|  |  |  |     ClassSpecifierAST *tst = tstDecl->decl_specifier_list->value->asClassSpecifier(); | 
					
						
							|  |  |  |     QVERIFY(tst); | 
					
						
							|  |  |  |     QtEnumDeclarationAST *qtEnum = tst->member_specifier_list->value->asQtEnumDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(qtEnum); | 
					
						
							|  |  |  |     SimpleNameAST *e = qtEnum->enumerator_list->value->asSimpleName(); | 
					
						
							|  |  |  |     QVERIFY(e); | 
					
						
							|  |  |  |     QCOMPARE(doc->unit->spell(e->identifier_token), "e"); | 
					
						
							|  |  |  |     QCOMPARE(e->name->identifier()->chars(), "e"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  | void tst_Semantic::lambda_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "void f() {\n" | 
					
						
							|  |  |  |                                             "  auto func = [](int a, int b) {return a + b;};\n" | 
					
						
							|  |  |  |                                             "}\n", false, false, true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							|  |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-13 13:04:54 +01:00
										 |  |  | void tst_Semantic::lambda_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  |                 "\n" | 
					
						
							|  |  |  |                 "class A {\n" | 
					
						
							|  |  |  |                 "  void f(int i = [](){});\n" | 
					
						
							|  |  |  |                 "};\n" | 
					
						
							|  |  |  |                 , false, false, true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							|  |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							|  |  |  |     Class *A = doc->globals->memberAt(0)->asClass(); | 
					
						
							|  |  |  |     QVERIFY(A); | 
					
						
							|  |  |  |     QCOMPARE(A->memberCount(), 1U); | 
					
						
							|  |  |  |     Declaration *d = A->memberAt(0)->asDeclaration(); | 
					
						
							|  |  |  |     QCOMPARE(d->name()->identifier()->chars(), "f"); | 
					
						
							|  |  |  |     Function *ty = d->type()->asFunctionType(); | 
					
						
							|  |  |  |     QVERIFY(ty); | 
					
						
							|  |  |  |     QCOMPARE(ty->argumentCount(), 1U); | 
					
						
							|  |  |  |     Argument *arg = ty->argumentAt(0)->asArgument(); | 
					
						
							|  |  |  |     QVERIFY(arg); | 
					
						
							|  |  |  |     const StringLiteral *init = arg->initializer(); | 
					
						
							|  |  |  |     QVERIFY(init); | 
					
						
							| 
									
										
										
										
											2013-09-05 11:32:09 +02:00
										 |  |  |     QCOMPARE(init->chars(), "[](){}"); | 
					
						
							| 
									
										
										
										
											2013-03-13 13:04:54 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 16:59:35 +01:00
										 |  |  | void tst_Semantic::diagnostic_error() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "class Foo {}\n", | 
					
						
							|  |  |  |                                             false, false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 1U); | 
					
						
							|  |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-23 12:10:08 +02:00
										 |  |  | QTEST_MAIN(tst_Semantic) | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | #include "tst_semantic.moc"
 |