diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 65d66be0207..69e645b1be9 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -316,6 +316,7 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast) translationUnit()->error(ast->ctor_initializer->firstToken(), "only constructors take base initializers"); } + accept(ast->ctor_initializer); } const int previousVisibility = semantic()->switchVisibility(Symbol::Public); diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp index 95181e4c7a0..5186055bca9 100644 --- a/src/shared/cplusplus/CheckDeclarator.cpp +++ b/src/shared/cplusplus/CheckDeclarator.cpp @@ -168,6 +168,9 @@ bool CheckDeclarator::visit(FunctionDeclaratorAST *ast) ast->symbol = fun; fun->setReturnType(_fullySpecifiedType); + if (_fullySpecifiedType.isVirtual()) + fun->setVirtual(true); + if (ast->parameters) { DeclarationListAST *parameter_declarations = ast->parameters->parameter_declarations; for (DeclarationListAST *decl = parameter_declarations; decl; decl = decl->next) { diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp index 27b33e62175..6e9980832f5 100644 --- a/src/shared/cplusplus/Symbols.cpp +++ b/src/shared/cplusplus/Symbols.cpp @@ -259,6 +259,12 @@ bool Function::hasArguments() const (argumentCount() == 1 && argumentAt(0)->type()->isVoidType())); } +bool Function::isVirtual() const +{ return f._isVirtual; } + +void Function::setVirtual(bool isVirtual) +{ f._isVirtual = isVirtual; } + bool Function::isVariadic() const { return f._isVariadic; } diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h index a911c21ab97..1454e012241 100644 --- a/src/shared/cplusplus/Symbols.h +++ b/src/shared/cplusplus/Symbols.h @@ -307,6 +307,9 @@ public: /** Convenience function that returns whether the function receives any arguments. */ bool hasArguments() const; + bool isVirtual() const; + void setVirtual(bool isVirtual); + bool isVariadic() const; void setVariadic(bool isVariadic); @@ -348,6 +351,7 @@ private: TemplateParameters *_templateParameters; FullySpecifiedType _returnType; struct Flags { + unsigned _isVirtual: 1; unsigned _isVariadic: 1; unsigned _isPureVirtual: 1; unsigned _isConst: 1;