| 
									
										
										
										
											2022-08-19 15:59:36 +02:00
										 |  |  | // Copyright (C) 2016 The Qt Company Ltd.
 | 
					
						
							| 
									
										
										
										
											2022-12-21 10:12:09 +01:00
										 |  |  | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
 | 
					
						
							| 
									
										
										
										
											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>
 | 
					
						
							| 
									
										
										
										
											2015-11-19 13:49:26 +01:00
										 |  |  | #include <cplusplus/DeprecatedGenTemplateInstance.h>
 | 
					
						
							| 
									
										
										
										
											2013-03-27 18:54:03 +01:00
										 |  |  | #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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-13 22:18:53 +03:00
										 |  |  | // to use in tests directly w/o convertion to int
 | 
					
						
							|  |  |  | Q_DECLARE_METATYPE(Function::RefQualifier) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |                             int line, int column, | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  |                             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
 | 
					
						
							| 
									
										
										
										
											2019-06-04 13:37:45 +02:00
										 |  |  |             qDebug() << fileName->chars()<<':'<<line<<':'<<column<<' ' << QString::vasprintf(format, ap); | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2019-07-23 10:58:00 +02:00
										 |  |  |             Q_UNUSED(fileName) | 
					
						
							|  |  |  |             Q_UNUSED(line) | 
					
						
							|  |  |  |             Q_UNUSED(column) | 
					
						
							|  |  |  |             Q_UNUSED(format) | 
					
						
							|  |  |  |             Q_UNUSED(ap) | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  | #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; | 
					
						
							| 
									
										
										
										
											2016-02-26 18:48:39 +01:00
										 |  |  |         features.cxxEnabled = true; | 
					
						
							| 
									
										
										
										
											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(); | 
					
						
							| 
									
										
										
										
											2014-11-13 22:18:53 +03:00
										 |  |  |     void function_declaration_ref_qualifier_data(); | 
					
						
							|  |  |  |     void function_declaration_ref_qualifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     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(); | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     void enum_constantValue1(); | 
					
						
							|  |  |  |     void enum_constantValue2(); | 
					
						
							|  |  |  |     void enum_constantValue3(); | 
					
						
							|  |  |  |     void enum_constantValue4(); | 
					
						
							| 
									
										
										
										
											2015-02-09 09:44:00 +01:00
										 |  |  |     void enum_constantValue5(); | 
					
						
							| 
									
										
										
										
											2015-12-06 15:25:26 +02:00
										 |  |  |     void enum_constantValueNegative(); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(funTy->returnType()->asVoidType()); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(funTy->argumentCount(), 0); | 
					
						
							| 
									
										
										
										
											2014-11-13 22:18:53 +03:00
										 |  |  |     QCOMPARE(funTy->refQualifier(), Function::NoRefQualifier); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 16:56:36 +02:00
										 |  |  |     QVERIFY(decl->name()->asNameId()); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(funTy->returnType()->asVoidType()); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(funTy->argumentCount(), 1); | 
					
						
							| 
									
										
										
										
											2014-11-13 22:18:53 +03:00
										 |  |  |     QCOMPARE(funTy->refQualifier(), Function::NoRefQualifier); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // 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(); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(argTy->asReferenceType()); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 16:56:36 +02:00
										 |  |  |     QVERIFY(decl->name()->asNameId()); | 
					
						
							| 
									
										
										
										
											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")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-13 22:18:53 +03:00
										 |  |  | void tst_Semantic::function_declaration_ref_qualifier_data() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTest::addColumn<QString>("code"); | 
					
						
							|  |  |  |     QTest::addColumn<bool>("success"); | 
					
						
							|  |  |  |     QTest::addColumn<Function::RefQualifier>("refQualifier"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("no") | 
					
						
							|  |  |  |             << "void f();" << true << Function::NoRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("no_const") | 
					
						
							|  |  |  |             << "void f() const;" << true << Function::NoRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("no_const_noexcept") | 
					
						
							|  |  |  |             << "void f() const noexcept;" << true << Function::NoRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("lvalue") | 
					
						
							|  |  |  |             << "void f() &;" << true << Function::LvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("lvalue_const") | 
					
						
							|  |  |  |             << "void f() const &;" << true << Function::LvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("lvalue_const_noexcept") | 
					
						
							|  |  |  |             << "void f() const & noexcept;" << true << Function::LvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("rvalue") | 
					
						
							|  |  |  |             << "void f() &&;" << true << Function::RvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("rvalue_const") | 
					
						
							|  |  |  |             << "void f() const &&;" << true << Function::RvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("rvalue_const_noexcept") | 
					
						
							|  |  |  |             << "void f() const && noexcept;" << true << Function::RvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("lvalue_more_spaces") | 
					
						
							|  |  |  |             << "void f()  const    &;" << true << Function::LvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("rvalue_more_spaces") | 
					
						
							|  |  |  |             << "void f()       &&    noexcept;" << true << Function::RvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("lvalue_more_newline") | 
					
						
							|  |  |  |             << "void f() const\n&;" << true << Function::LvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("rvalue_more_newline") | 
					
						
							|  |  |  |             << "void f() const\n&&;" << true << Function::RvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("lvalue_no_space") | 
					
						
							|  |  |  |             << "void f() const& noexcept;" << true << Function::LvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("rvalue_no_space") | 
					
						
							|  |  |  |             << "void f() const&& noexcept;" << true << Function::RvalueRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("lvalue_before_const") | 
					
						
							|  |  |  |             << "void f() & const;" << false << Function::NoRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("rvalue_before_const") | 
					
						
							|  |  |  |             << "void f() && const;" << false << Function::NoRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("lvalue_after_noexcept") | 
					
						
							|  |  |  |             << "void f() const noexcept &;" << false << Function::NoRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("rvalue_after_noexcept") | 
					
						
							|  |  |  |             << "void f() const noexcept &&;" << false << Function::NoRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("lvalue_double") | 
					
						
							|  |  |  |             << "void f() const & & noexcept;" << false << Function::NoRefQualifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("rvalue_double") | 
					
						
							|  |  |  |             << "void f() const && && noexcept;" << false << Function::NoRefQualifier; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::function_declaration_ref_qualifier() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QFETCH(QString, code); | 
					
						
							|  |  |  |     QFETCH(bool, success); | 
					
						
							|  |  |  |     QFETCH(Function::RefQualifier, refQualifier); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document(code.toUtf8(), false, false, true); | 
					
						
							|  |  |  |     if (!success) { | 
					
						
							|  |  |  |         QVERIFY(doc->errorCount > 0); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2014-11-13 22:18:53 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     FullySpecifiedType declTy = decl->type(); | 
					
						
							|  |  |  |     Function *funTy = declTy->asFunctionType(); | 
					
						
							|  |  |  |     QVERIFY(funTy); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(funTy->returnType()->asVoidType()); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(funTy->argumentCount(), 0); | 
					
						
							| 
									
										
										
										
											2014-11-13 22:18:53 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // check the ref-qualifier
 | 
					
						
							|  |  |  |     QCOMPARE(funTy->refQualifier(), refQualifier); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | void tst_Semantic::function_definition_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("void foo() {}"); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(funTy->returnType()->asVoidType()); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(funTy->argumentCount(), 0); | 
					
						
							| 
									
										
										
										
											2014-11-13 22:18:53 +03:00
										 |  |  |     QCOMPARE(funTy->refQualifier(), Function::NoRefQualifier); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 16:56:36 +02:00
										 |  |  |     QVERIFY(funTy->name()->asNameId()); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 2); | 
					
						
							| 
									
										
										
										
											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")); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(classObject->baseClassCount(), 0); | 
					
						
							|  |  |  |     QCOMPARE(classObject->memberCount(), 2); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2013-05-30 12:40:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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()); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(decl->type()->asIntegerType()); | 
					
						
							| 
									
										
										
										
											2013-05-30 12:40:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 3); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(anonStruct->memberCount(), 2); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 3); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(_pointStruct->memberCount(), 2); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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()); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(typedefPointDecl->type()->asNamedType()); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 2); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(_pointStruct->memberCount(), 2); | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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()); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(typedefPointDecl->type()->asPointerType()); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(decl->type()->asFunctionType()); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  |     Function *funTy = decl->type()->asFunctionType(); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(funTy->returnType()->asIntegerType()); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(funTy->argumentCount(), 1); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  |     Argument *arg = funTy->argumentAt(0)->asArgument(); | 
					
						
							|  |  |  |     QVERIFY(arg); | 
					
						
							|  |  |  |     QVERIFY(! arg->type().isConst()); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(arg->type()->asPointerType()); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  |     QVERIFY(arg->type()->asPointerType()->elementType().isConst()); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(arg->type()->asPointerType()->elementType()->asIntegerType()); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::const_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  | "int foo(char * const s);\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(decl->type()->asFunctionType()); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  |     Function *funTy = decl->type()->asFunctionType(); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(funTy->returnType()->asIntegerType()); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(funTy->argumentCount(), 1); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  |     Argument *arg = funTy->argumentAt(0)->asArgument(); | 
					
						
							|  |  |  |     QVERIFY(arg); | 
					
						
							|  |  |  |     QVERIFY(arg->type().isConst()); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(arg->type()->asPointerType()); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  |     QVERIFY(! arg->type()->asPointerType()->elementType().isConst()); | 
					
						
							| 
									
										
										
										
											2022-06-24 16:45:12 +02:00
										 |  |  |     QVERIFY(arg->type()->asPointerType()->elementType()->asIntegerType()); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 23:07:05 +03:00
										 |  |  |     TemplateArgument templArgs[] = {FullySpecifiedType(control->integerType(IntegerType::Int))}; | 
					
						
							| 
									
										
										
										
											2015-11-19 13:49:26 +01:00
										 |  |  |     const Name *templId = control->templateNameId(control->identifier("QList"), false, templArgs, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-19 13:49:26 +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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 09:14:38 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor(LanguageFeatures::defaultFeatures()); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 09:14:38 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor(LanguageFeatures::defaultFeatures()); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 09:14:38 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor(LanguageFeatures::defaultFeatures()); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 09:14:38 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor(LanguageFeatures::defaultFeatures()); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 09:14:38 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor(LanguageFeatures::defaultFeatures()); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 2); | 
					
						
							| 
									
										
										
										
											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()); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(iface->memberCount(), 2); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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()); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(impl->memberCount(), 3); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											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()); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(iface->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Declaration *decl = iface->memberAt(0)->asDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  |     QVERIFY(decl->name()); | 
					
						
							|  |  |  |     const SelectorNameId *selId = decl->name()->asSelectorNameId(); | 
					
						
							|  |  |  |     QVERIFY(selId); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(selId->nameCount(), 3); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(iface->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(selId->nameCount(), 3); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2012-03-20 13:59:38 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2013-03-13 13:04:54 +01:00
										 |  |  |     Class *A = doc->globals->memberAt(0)->asClass(); | 
					
						
							|  |  |  |     QVERIFY(A); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(A->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2013-03-13 13:04:54 +01:00
										 |  |  |     Declaration *d = A->memberAt(0)->asDeclaration(); | 
					
						
							|  |  |  |     QCOMPARE(d->name()->identifier()->chars(), "f"); | 
					
						
							|  |  |  |     Function *ty = d->type()->asFunctionType(); | 
					
						
							|  |  |  |     QVERIFY(ty); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(ty->argumentCount(), 1); | 
					
						
							| 
									
										
										
										
											2013-03-13 13:04:54 +01:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2011-02-17 16:59:35 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  | namespace { | 
					
						
							|  |  |  | void testEnumaratorDeclarator(Enum *e, int enumDeclIndex, const char *expectedConstantValue) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Declaration *enumMemberDeclaration = e->memberAt(enumDeclIndex)->asDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(enumMemberDeclaration); | 
					
						
							|  |  |  |     EnumeratorDeclaration *enumeratorDeclaration = enumMemberDeclaration->asEnumeratorDeclarator(); | 
					
						
							|  |  |  |     QVERIFY(enumeratorDeclaration); | 
					
						
							|  |  |  |     if (const StringLiteral *constantValue = enumeratorDeclaration->constantValue()) | 
					
						
							|  |  |  |         QCOMPARE(constantValue->chars(), expectedConstantValue); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         QVERIFY(!expectedConstantValue); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | } // anonymous
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::enum_constantValue1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "enum {\n" | 
					
						
							|  |  |  |                                             "E1,\n" | 
					
						
							|  |  |  |                                             "E2,\n" | 
					
						
							|  |  |  |                                             "E3\n" | 
					
						
							|  |  |  |                                             "};\n" | 
					
						
							|  |  |  |                                             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  |     Enum *e = doc->globals->memberAt(0)->asEnum(); | 
					
						
							|  |  |  |     QVERIFY(e); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(e->memberCount(), 3); | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 0, "0"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 1, "1"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 2, "2"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::enum_constantValue2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "enum {\n" | 
					
						
							|  |  |  |                                             "E1=10,\n" | 
					
						
							|  |  |  |                                             "E2,\n" | 
					
						
							|  |  |  |                                             "E3\n" | 
					
						
							|  |  |  |                                             "};\n" | 
					
						
							|  |  |  |                                             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  |     Enum *e = doc->globals->memberAt(0)->asEnum(); | 
					
						
							|  |  |  |     QVERIFY(e); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(e->memberCount(), 3); | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 0, "10"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 1, "11"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 2, "12"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::enum_constantValue3() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "enum {\n" | 
					
						
							|  |  |  |                                             "E1,\n" | 
					
						
							|  |  |  |                                             "E2=10,\n" | 
					
						
							|  |  |  |                                             "E3\n" | 
					
						
							|  |  |  |                                             "};\n" | 
					
						
							|  |  |  |                                             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  |     Enum *e = doc->globals->memberAt(0)->asEnum(); | 
					
						
							|  |  |  |     QVERIFY(e); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(e->memberCount(), 3); | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 0, "0"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 1, "10"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 2, "11"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::enum_constantValue4() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "enum {\n" | 
					
						
							|  |  |  |                                             "E1,\n" | 
					
						
							|  |  |  |                                             "E2=E1+10,\n" | 
					
						
							|  |  |  |                                             "E3,\n" | 
					
						
							|  |  |  |                                             "E4=10,\n" | 
					
						
							|  |  |  |                                             "E5\n" | 
					
						
							|  |  |  |                                             "};\n" | 
					
						
							|  |  |  |                                             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  |     Enum *e = doc->globals->memberAt(0)->asEnum(); | 
					
						
							|  |  |  |     QVERIFY(e); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(e->memberCount(), 5); | 
					
						
							| 
									
										
										
										
											2014-12-02 10:57:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 0, "0"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 1, "E1+10"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 2, NULL); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 3, "10"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 4, "11"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-09 09:44:00 +01:00
										 |  |  | void tst_Semantic::enum_constantValue5() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "enum {\n" | 
					
						
							|  |  |  |                                             "E1,\n" | 
					
						
							|  |  |  |                                             "E2=E1,\n" | 
					
						
							|  |  |  |                                             "E3,\n" | 
					
						
							|  |  |  |                                             "E4=E3,\n" | 
					
						
							|  |  |  |                                             "E5\n" | 
					
						
							|  |  |  |                                             "};\n" | 
					
						
							|  |  |  |                                             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2015-02-09 09:44:00 +01:00
										 |  |  |     Enum *e = doc->globals->memberAt(0)->asEnum(); | 
					
						
							|  |  |  |     QVERIFY(e); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(e->memberCount(), 5); | 
					
						
							| 
									
										
										
										
											2015-02-09 09:44:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 0, "0"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 1, "0"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 2, "1"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 3, "1"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 4, "2"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-06 15:25:26 +02:00
										 |  |  | void tst_Semantic::enum_constantValueNegative() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  |                 "enum {\n" | 
					
						
							|  |  |  |                 "  E1=-2,\n" | 
					
						
							|  |  |  |                 "  E2,\n" | 
					
						
							|  |  |  |                 "  E3,\n" | 
					
						
							|  |  |  |                 "  E4\n" | 
					
						
							|  |  |  |                 "};\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1); | 
					
						
							| 
									
										
										
										
											2015-12-06 15:25:26 +02:00
										 |  |  |     Enum *e = doc->globals->memberAt(0)->asEnum(); | 
					
						
							|  |  |  |     QVERIFY(e); | 
					
						
							| 
									
										
										
										
											2019-07-24 18:40:10 +02:00
										 |  |  |     QCOMPARE(e->memberCount(), 4); | 
					
						
							| 
									
										
										
										
											2015-12-06 15:25:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 0, "-2"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 1, "-1"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 2, "0"); | 
					
						
							|  |  |  |     testEnumaratorDeclarator(e, 3, "1"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-10 12:21:30 +02:00
										 |  |  | QTEST_GUILESS_MAIN(tst_Semantic) | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | #include "tst_semantic.moc"
 |