forked from qt-creator/qt-creator
		
	We need to take into account that the ">>" in constructs such as std::vector<std::pair<int, int>> is only one token on the clang side. Change-Id: I90f002ca56f236032f6d39c338593a2ff7590061 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: David Schulz <david.schulz@qt.io>
		
			
				
	
	
		
			774 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			774 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| auto *Variable       = "Variable";
 | |
| auto *u8Variable     = u8"Variable";
 | |
| auto *rawVariable    = R"(Variable)";
 | |
| auto Character       = 'c';
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| auto integer         = 1;
 | |
| auto numFloat        = 1.2f;
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| int function(int x)
 | |
| {
 | |
|     return x;
 | |
| }
 | |
| 
 | |
| struct Foo
 | |
| {
 | |
|     void memberFunction() {}
 | |
| };
 | |
| 
 | |
| int functionDeclaration(int x);
 | |
| 
 | |
| struct Foo2
 | |
| {
 | |
|     void memberFunction();
 | |
| };
 | |
| 
 | |
| void f()
 | |
| {
 | |
|     function(1);
 | |
| }
 | |
| 
 | |
| struct ConversionFunction {
 | |
|     operator Foo();
 | |
|     operator int();
 | |
| };
 | |
| 
 | |
| void TypeReference()
 | |
| {
 | |
|     Foo foo;
 | |
| }
 | |
| 
 | |
| void LocalVariableDeclaration()
 | |
| {
 | |
|     Foo foo;
 | |
| 
 | |
|     foo.memberFunction();
 | |
| }
 | |
| 
 | |
| void LocalVariableFunctionArgument(Foo &foo)
 | |
| {
 | |
|     foo.memberFunction();
 | |
| }
 | |
| 
 | |
| struct Foo3 {
 | |
|     int ClassMember;
 | |
| 
 | |
|     void ClassMemberReference()
 | |
|     {
 | |
|         ClassMember++;
 | |
|     }
 | |
| };
 | |
| 
 | |
| struct Foo4
 | |
| {
 | |
|     void MemberFunctionReference();
 | |
| 
 | |
|     void function()
 | |
|     {
 | |
|         MemberFunctionReference();
 | |
|     }
 | |
| };
 | |
| 
 | |
| struct Foo5
 | |
| {
 | |
|     void StaticMethod();
 | |
| 
 | |
|     void function()
 | |
|     {
 | |
|         Foo5::StaticMethod();
 | |
|     }
 | |
| };
 | |
| 
 | |
| enum Enumeration
 | |
| {
 | |
|     Enumerator
 | |
| };
 | |
| 
 | |
| void f2()
 | |
| {
 | |
|     Enumeration enumeration;
 | |
| 
 | |
|     enumeration = Enumerator;
 | |
| }
 | |
| 
 | |
| class ForwardReference;
 | |
| 
 | |
| class Class
 | |
| { public:
 | |
|     Class();
 | |
|     ~Class();
 | |
| };
 | |
| 
 | |
| ForwardReference *f3()
 | |
| {
 | |
|     Class ConstructorReference;
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| union Union
 | |
| {
 | |
| 
 | |
| };
 | |
| 
 | |
| Union UnionDeclarationReference;
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| namespace NameSpace {
 | |
| struct StructInNameSpace {};
 | |
| }
 | |
| 
 | |
| namespace NameSpaceAlias = NameSpace;
 | |
| using NameSpace::StructInNameSpace;
 | |
| NameSpace::StructInNameSpace foo6;
 | |
| 
 | |
| class BaseClass {
 | |
| public:
 | |
|     virtual void VirtualFunction();
 | |
|     virtual void FinalVirtualFunction();
 | |
| };
 | |
| 
 | |
| 
 | |
| void f8()
 | |
| {
 | |
|     BaseClass NonVirtualFunctionCall;
 | |
|     NonVirtualFunctionCall.VirtualFunction();
 | |
| 
 | |
|     BaseClass *NonVirtualFunctionCallPointer = new BaseClass();
 | |
|     NonVirtualFunctionCallPointer->VirtualFunction();
 | |
| }
 | |
| 
 | |
| class DerivedClass : public BaseClass
 | |
| {public:
 | |
|     void VirtualFunction() override;
 | |
|     void FinalVirtualFunction() final;
 | |
| };
 | |
| 
 | |
| void f8(BaseClass *VirtualFunctionCallPointer)
 | |
| {
 | |
|     VirtualFunctionCallPointer->VirtualFunction();
 | |
| }
 | |
| 
 | |
| class FinalClass final : public DerivedClass
 | |
| {
 | |
|     void FinalClassThisCall();
 | |
| };
 | |
| 
 | |
| void f8(DerivedClass *FinalVirtualFunctionCallPointer)
 | |
| {
 | |
|     FinalVirtualFunctionCallPointer->FinalVirtualFunction();
 | |
| }
 | |
| 
 | |
| void f9(BaseClass *NonFinalVirtualFunctionCallPointer)
 | |
| {
 | |
|     NonFinalVirtualFunctionCallPointer->FinalVirtualFunction();
 | |
| }
 | |
| 
 | |
| void f10(FinalClass *ClassFinalVirtualFunctionCallPointer)
 | |
| {
 | |
|     ClassFinalVirtualFunctionCallPointer->VirtualFunction();
 | |
| }
 | |
| 
 | |
| class Operator {
 | |
| public:
 | |
|     Operator operator+=(const Operator &first);
 | |
| };
 | |
| 
 | |
| Operator operator+(const Operator &first, const Operator &second);
 | |
| 
 | |
| void f10()
 | |
| {
 | |
|     auto PlusOperator = Operator() + Operator();
 | |
|     Operator PlusAssignOperator;
 | |
|     PlusAssignOperator += Operator();
 | |
| }
 | |
| 
 | |
| /* Comment */
 | |
| 
 | |
| #define PreprocessorDefinition Class
 | |
| #define MacroDefinition(a,b) ((a)>(b)?(a):(b))
 | |
| 
 | |
| void f11()
 | |
| {
 | |
|     MacroDefinition(2, 4);
 | |
| }
 | |
| 
 | |
| #include "highlightingmarks.h"
 | |
| 
 | |
| void f12() {
 | |
| GOTO_LABEL:
 | |
| 
 | |
|     goto GOTO_LABEL;
 | |
| }
 | |
| 
 | |
| template <class T>
 | |
| void TemplateFunction(T v)
 | |
| {
 | |
|     T XXXXX = v;
 | |
| }
 | |
| void TemplateReference()
 | |
| {
 | |
|     TemplateFunction(1);
 | |
| //    std::vector<int> TemplateIntance;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| template <class T>
 | |
| class TemplateFoo {};
 | |
| 
 | |
| 
 | |
| template <class TemplateTypeParameter = Foo, int NonTypeTemplateParameter = 1, template <class> class TemplateTemplateParameter = TemplateFoo>
 | |
| void TemplateFunction(TemplateTypeParameter TemplateParameter)
 | |
| {
 | |
|     TemplateTypeParameter TemplateTypeParameterReference;
 | |
|     auto NonTypeTemplateParameterReference = NonTypeTemplateParameter;
 | |
|     TemplateTemplateParameter<TemplateTypeParameter> TemplateTemplateParameterReference;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| void FinalClass::FinalClassThisCall()
 | |
| {
 | |
|     VirtualFunction();
 | |
| }
 | |
| 
 | |
| 
 | |
| void OutputArgument(int &one, const int &two, int *three=0);
 | |
| 
 | |
| void f12b()
 | |
| {
 | |
|     int One;
 | |
|     OutputArgument(One, 2);
 | |
| }
 | |
| 
 | |
| #include <highlightingmarks.h>
 | |
| 
 | |
| #define FOREACH(variable, container) \
 | |
|     variable; \
 | |
|     auto x = container;
 | |
| 
 | |
| #define foreach2 FOREACH
 | |
| 
 | |
| 
 | |
| 
 | |
| void f13()
 | |
| {
 | |
|     auto container = 1;
 | |
|     foreach2(int index, container);
 | |
| }
 | |
| 
 | |
| class SecondArgumentInMacroExpansionIsField {
 | |
|     int container = 1;
 | |
| 
 | |
|     void f()
 | |
|     {
 | |
|         foreach2(int index, container);
 | |
|     }
 | |
| };
 | |
| 
 | |
| typedef unsigned uint32;
 | |
| 
 | |
| enum EnumerationType : uint32
 | |
| {
 | |
|     Other = 0,
 | |
| };
 | |
| 
 | |
| 
 | |
| struct TypeInCast {
 | |
|     void function();
 | |
| };
 | |
| 
 | |
| void f14()
 | |
| {
 | |
|     static_cast<void (TypeInCast::*)()>(&TypeInCast::function);
 | |
|     reinterpret_cast<void (TypeInCast::*)()>(&TypeInCast::function);
 | |
| }
 | |
| 
 | |
| using IntegerAlias = int;
 | |
| using SecondIntegerAlias = IntegerAlias;
 | |
| typedef int IntegerTypedef;
 | |
| using Function = void (*)();
 | |
| 
 | |
| 
 | |
| 
 | |
| void f15()
 | |
| {
 | |
|     IntegerAlias integerAlias;
 | |
|     SecondIntegerAlias secondIntegerAlias;
 | |
|     IntegerTypedef integerTypedef;
 | |
|     Function();
 | |
| }
 | |
| 
 | |
| class FriendFoo
 | |
| {
 | |
| public:
 | |
|     friend class FooFriend;
 | |
|     friend bool operator==(const FriendFoo &first, const FriendFoo &second);
 | |
| };
 | |
| 
 | |
| class FieldInitialization
 | |
| {
 | |
| public:
 | |
|     FieldInitialization() :
 | |
|         member(0)
 | |
|     {}
 | |
| 
 | |
|     int member;
 | |
| };
 | |
| 
 | |
| template<class Type>
 | |
| void TemplateFunctionCall(Type type)
 | |
| {
 | |
|     type + type;
 | |
| }
 | |
| 
 | |
| void f16()
 | |
| {
 | |
|     TemplateFunctionCall(1);
 | |
| }
 | |
| 
 | |
| 
 | |
| template <typename T>
 | |
| class TemplatedType
 | |
| {
 | |
|     T value = T();
 | |
| };
 | |
| 
 | |
| void f17()
 | |
| {
 | |
|     TemplatedType<int> TemplatedTypeDeclaration;
 | |
| }
 | |
| 
 | |
| void f18()
 | |
| {
 | |
|     auto value = 1 + 2;
 | |
| }
 | |
| 
 | |
| class ScopeClass
 | |
| {
 | |
| public:
 | |
|     static void ScopeOperator();
 | |
| };
 | |
| 
 | |
| void f19()
 | |
| {
 | |
|     ScopeClass::ScopeOperator();
 | |
| }
 | |
| 
 | |
| namespace TemplateClassNamespace {
 | |
| template<class X>
 | |
| class TemplateClass
 | |
| {
 | |
| 
 | |
| };
 | |
| }
 | |
| 
 | |
| void f20()
 | |
| {
 | |
|    TemplateClassNamespace::TemplateClass<ScopeClass> TemplateClassDefinition;
 | |
| }
 | |
| 
 | |
| void f21()
 | |
| {
 | |
|     typedef int TypeDefDeclaration;
 | |
|     TypeDefDeclaration TypeDefDeclarationUsage;
 | |
| }
 | |
| 
 | |
| typedef int EnumerationTypeDef;
 | |
| 
 | |
| enum Enumeration2 : EnumerationTypeDef {
 | |
| 
 | |
| };
 | |
| 
 | |
| struct Bar {
 | |
|     Bar &operator[](int &key);
 | |
| };
 | |
| 
 | |
| void argumentToUserDefinedIndexOperator(Bar object, int index = 3)
 | |
| {
 | |
|     object[index];
 | |
| }
 | |
| 
 | |
| struct LambdaTester
 | |
| {
 | |
|     int member = 0;
 | |
|     void func() {
 | |
|         const int var = 42, var2 = 84;
 | |
|         auto lambda = [var, this](int input) {
 | |
|             return var + input + member;
 | |
|         };
 | |
|         lambda(var2);
 | |
|     }
 | |
| };
 | |
| 
 | |
| void NonConstReferenceArgument(int &argument);
 | |
| 
 | |
| void f22()
 | |
| {
 | |
|     int x = 1;
 | |
| 
 | |
|     NonConstReferenceArgument(x);
 | |
| }
 | |
| 
 | |
| void ConstReferenceArgument(const int &argument);
 | |
| 
 | |
| void f23()
 | |
| {
 | |
|     int x = 1;
 | |
| 
 | |
|     ConstReferenceArgument(x);
 | |
| }
 | |
| 
 | |
| void RValueReferenceArgument(int &&argument);
 | |
| 
 | |
| void f24()
 | |
| {
 | |
|     int x = 1;
 | |
| 
 | |
|     RValueReferenceArgument(static_cast<int&&>(x));
 | |
| }
 | |
| 
 | |
| void NonConstPointerArgument(int *argument);
 | |
| 
 | |
| void f25()
 | |
| {
 | |
|     int *x;
 | |
| 
 | |
|     NonConstPointerArgument(x);
 | |
| }
 | |
| 
 | |
| void PointerToConstArgument(const int *argument);
 | |
| void ConstPointerArgument(int *const argument);
 | |
| void f26()
 | |
| {
 | |
|     int *x;
 | |
|     PointerToConstArgument(x);
 | |
|     ConstPointerArgument(x);
 | |
| }
 | |
| 
 | |
| void NonConstReferenceArgumentCallInsideCall(int x, int &argument);
 | |
| int GetArgument(int x);
 | |
| 
 | |
| void f27()
 | |
| {
 | |
|     int x = 1;
 | |
| 
 | |
|     NonConstReferenceArgumentCallInsideCall(GetArgument(x), x);
 | |
| }
 | |
| 
 | |
| void f28(int &Reference)
 | |
| {
 | |
|     NonConstReferenceArgument(Reference);
 | |
| }
 | |
| 
 | |
| void f29()
 | |
| {
 | |
|     int x;
 | |
| 
 | |
|     NonConstPointerArgument(&x);
 | |
| }
 | |
| 
 | |
| struct NonConstPointerArgumentAsMemberOfClass
 | |
| {
 | |
|     int member;
 | |
| };
 | |
| 
 | |
| void f30()
 | |
| {
 | |
|     NonConstPointerArgumentAsMemberOfClass instance;
 | |
| 
 | |
|     NonConstReferenceArgument(instance.member);
 | |
| }
 | |
| 
 | |
| struct NonConstReferenceArgumentConstructor
 | |
| {
 | |
|     NonConstReferenceArgumentConstructor() = default;
 | |
|     NonConstReferenceArgumentConstructor(NonConstReferenceArgumentConstructor &other);
 | |
| 
 | |
|     void NonConstReferenceArgumentMember(NonConstReferenceArgumentConstructor &other);
 | |
| };
 | |
| 
 | |
| void f31()
 | |
| {
 | |
|     NonConstReferenceArgumentConstructor instance;
 | |
| 
 | |
|     NonConstReferenceArgumentConstructor copy(instance);
 | |
| }
 | |
| 
 | |
| struct NonConstReferenceMemberInitialization
 | |
| {
 | |
|     NonConstReferenceMemberInitialization(int &foo)
 | |
|         : foo(foo)
 | |
|     {}
 | |
| 
 | |
|     int &foo;
 | |
| };
 | |
| 
 | |
| template<class T> class Coo;
 | |
| template<class T> class Coo<T*>;
 | |
| 
 | |
| namespace N { void goo(); }
 | |
| using N::goo;
 | |
| 
 | |
| #if 1
 | |
| #endif
 | |
| 
 | |
| #include <new>
 | |
| 
 | |
| struct OtherOperator { void operator()(int); };
 | |
| void g(OtherOperator o, int var)
 | |
| {
 | |
|     o(var);
 | |
| }
 | |
| 
 | |
| void NonConstPointerArgument(int &argument);
 | |
| 
 | |
| struct PointerGetterClass
 | |
| {
 | |
|     int &getter();
 | |
| };
 | |
| 
 | |
| void f32()
 | |
| {
 | |
|     PointerGetterClass x;
 | |
| 
 | |
|     NonConstPointerArgument(x.getter());
 | |
| }
 | |
| 
 | |
| namespace N { template <typename T> void SizeIs(); }
 | |
| using N::SizeIs;
 | |
| 
 | |
| void BaseClass::VirtualFunction() {}
 | |
| 
 | |
| class WithVirtualFunctionDefined {
 | |
|   virtual void VirtualFunctionDefinition() {};
 | |
| };
 | |
| 
 | |
| namespace NFoo { namespace NBar { namespace NTest { class NamespaceTypeSpelling; } } }
 | |
| 
 | |
| Undeclared u;
 | |
| #define Q_PROPERTY(arg) static_assert("Q_PROPERTY", #arg); // Keep these in sync with wrappedQtHeaders/QtCore/qobjectdefs.h
 | |
| #define SIGNAL(arg) #arg
 | |
| #define SLOT(arg) #arg
 | |
| class Property {
 | |
|     Q_PROPERTY(const volatile unsigned long long * prop READ getProp WRITE setProp NOTIFY propChanged)
 | |
|     Q_PROPERTY(const QString str READ getStr)
 | |
| };
 | |
| 
 | |
| struct X {
 | |
|     void operator*(int) {}
 | |
| };
 | |
| 
 | |
| void operator*(X, float) {}
 | |
| 
 | |
| void CallSite() {
 | |
|     X x;
 | |
|     int y = 10;
 | |
|     float z = 10;
 | |
|     x * y;
 | |
|     x * z;
 | |
| }
 | |
| 
 | |
| struct Dummy {
 | |
|     Dummy operator<<=(int key);
 | |
|     Dummy operator()(int a);
 | |
|     int& operator[] (unsigned index);
 | |
|     void* operator new(unsigned size);
 | |
|     void operator delete(void* ptr);
 | |
|     void* operator new[](unsigned size);
 | |
|     void operator delete[](void* ptr);
 | |
| };
 | |
| 
 | |
| void TryOverloadedOperators(Dummy object)
 | |
| {
 | |
|     object <<= 3;
 | |
| 
 | |
|     Dummy stacked;
 | |
|     stacked(4);
 | |
|     stacked[1];
 | |
|     int *i = new int;
 | |
|     Dummy* use_new = new Dummy();
 | |
|     delete use_new;
 | |
|     Dummy* many = new Dummy[10];
 | |
|     delete [] many;
 | |
| }
 | |
| 
 | |
| enum {
 | |
|     Test = 0
 | |
| };
 | |
| 
 | |
| namespace {
 | |
| class B {
 | |
|     struct {
 | |
|         int a;
 | |
|     };
 | |
| };
 | |
| }
 | |
| 
 | |
| struct Dummy2 {
 | |
|     Dummy2 operator()();
 | |
|     int operator*();
 | |
|     Dummy2 operator=(int foo);
 | |
| };
 | |
| 
 | |
| void TryOverloadedOperators2(Dummy object)
 | |
| {
 | |
|     Dummy2 dummy2;
 | |
|     dummy2();
 | |
|     *dummy2;
 | |
|     dummy2 = 3;
 | |
| }
 | |
| 
 | |
| int OperatorTest() {
 | |
|     return 1 < 2 ? 20 : 30;
 | |
| }
 | |
| 
 | |
| int signalSlotTest() {
 | |
|     SIGNAL(something(QString));
 | |
|     SLOT(something(QString));
 | |
|     SIGNAL(something(QString (*func1)(QString)));
 | |
|     1 == 2;
 | |
| }
 | |
| 
 | |
| class NonConstParameterConstructor
 | |
| {
 | |
|     NonConstParameterConstructor() = default;
 | |
|     NonConstParameterConstructor(NonConstParameterConstructor &buildDependenciesStorage);
 | |
| 
 | |
|     void Call()
 | |
|     {
 | |
|         NonConstParameterConstructor foo;
 | |
|         NonConstParameterConstructor bar(foo);
 | |
|     }
 | |
| };
 | |
| 
 | |
| class StaticMembersAccess
 | |
| {
 | |
| protected:
 | |
|     static int protectedValue;
 | |
| 
 | |
| private:
 | |
|     static int privateValue;
 | |
| };
 | |
| 
 | |
| template <int i, int j> struct S { };
 | |
| template <int i> using spec = S<i, 1>;
 | |
| spec<2> s;
 | |
| 
 | |
| class Property {
 | |
|     Q_PROPERTY(
 | |
| 
 | |
|             const
 | |
| 
 | |
|             volatile
 | |
| 
 | |
|             unsigned
 | |
| 
 | |
|             long
 | |
| 
 | |
|             long
 | |
| 
 | |
|             *
 | |
| 
 | |
|             prop
 | |
| 
 | |
|             READ
 | |
| 
 | |
|             getProp
 | |
| 
 | |
|             WRITE
 | |
| 
 | |
|             setProp
 | |
| 
 | |
|             NOTIFY
 | |
| 
 | |
|             propChanged
 | |
| 
 | |
|             )
 | |
| };
 | |
| 
 | |
| void structuredBindingTest() {
 | |
|     const int a[] = {1, 2};
 | |
|     const auto [x, y] = a;
 | |
| }
 | |
| 
 | |
| #define ASSIGN(decl, ptr) do { decl = *ptr; } while (false)
 | |
| #define ASSIGN2 ASSIGN
 | |
| void f4()
 | |
| {
 | |
|     int *thePointer = 0;
 | |
|     ASSIGN(int i, thePointer);
 | |
|     ASSIGN2(int i, thePointer);
 | |
| }
 | |
| 
 | |
| const int MyConstant = 8;
 | |
| void f5()
 | |
| {
 | |
|     int arr[MyConstant][8];
 | |
| }
 | |
| 
 | |
| static int GlobalVar = 0;
 | |
| 
 | |
| namespace N { [[deprecated]] void f(); }
 | |
| 
 | |
| template<typename T>
 | |
| void func(T v);
 | |
| 
 | |
| void f6()
 | |
| {
 | |
|     GlobalVar = 5;
 | |
|     func(1);  // QTCREATORBUG-21856
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| void func(T v) {
 | |
|     GlobalVar = 5;
 | |
| }
 | |
| 
 | |
| static std::vector<std::pair<int, int>> pv;
 |