summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp34
-rw-r--r--src/shared/cplusplus/Semantic.cpp8
-rw-r--r--src/shared/cplusplus/Semantic.h3
3 files changed, 29 insertions, 16 deletions
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index ef71c79809..038d70b9a4 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -304,26 +304,28 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
ast->symbol = fun;
_scope->enterSymbol(fun);
- if (ast->ctor_initializer) {
- bool looksLikeCtor = false;
- if (ty.isValid() || ! fun->identity())
- looksLikeCtor = false;
- else if (fun->identity()->isNameId() || fun->identity()->isTemplateNameId())
- looksLikeCtor = true;
-
- if (! looksLikeCtor) {
- translationUnit()->error(ast->ctor_initializer->firstToken(),
- "only constructors take base initializers");
+ if (! semantic()->skipFunctionBodies()) {
+ if (ast->ctor_initializer) {
+ bool looksLikeCtor = false;
+ if (ty.isValid() || ! fun->identity())
+ looksLikeCtor = false;
+ else if (fun->identity()->isNameId() || fun->identity()->isTemplateNameId())
+ looksLikeCtor = true;
+
+ if (! looksLikeCtor) {
+ translationUnit()->error(ast->ctor_initializer->firstToken(),
+ "only constructors take base initializers");
+ }
}
- }
- const int previousVisibility = semantic()->switchVisibility(Symbol::Public);
- const int previousMethodKey = semantic()->switchMethodKey(Function::NormalMethod);
+ const int previousVisibility = semantic()->switchVisibility(Symbol::Public);
+ const int previousMethodKey = semantic()->switchMethodKey(Function::NormalMethod);
- semantic()->check(ast->function_body, fun->members());
+ semantic()->check(ast->function_body, fun->members());
- semantic()->switchMethodKey(previousMethodKey);
- semantic()->switchVisibility(previousVisibility);
+ semantic()->switchMethodKey(previousMethodKey);
+ semantic()->switchVisibility(previousVisibility);
+ }
return false;
}
diff --git a/src/shared/cplusplus/Semantic.cpp b/src/shared/cplusplus/Semantic.cpp
index ff0fa418f8..9e7108bbc5 100644
--- a/src/shared/cplusplus/Semantic.cpp
+++ b/src/shared/cplusplus/Semantic.cpp
@@ -67,6 +67,7 @@ public:
Data(Semantic *semantic, Control *control)
: semantic(semantic),
control(control),
+ skipFunctionBodies(false),
visibility(Symbol::Public),
methodKey(Function::NormalMethod),
checkSpecifier(0),
@@ -89,6 +90,7 @@ public:
Semantic *semantic;
Control *control;
+ bool skipFunctionBodies;
int visibility;
int methodKey;
CheckSpecifier *checkSpecifier;
@@ -142,6 +144,12 @@ Name *Semantic::check(NameAST *name, Scope *scope)
Name *Semantic::check(NestedNameSpecifierAST *name, Scope *scope)
{ return d->checkName->check(name, scope); }
+bool Semantic::skipFunctionBodies() const
+{ return d->skipFunctionBodies; }
+
+void Semantic::setSkipFunctionBodies(bool skipFunctionBodies)
+{ d->skipFunctionBodies = skipFunctionBodies; }
+
int Semantic::currentVisibility() const
{ return d->visibility; }
diff --git a/src/shared/cplusplus/Semantic.h b/src/shared/cplusplus/Semantic.h
index ef9753b092..9b9a4195be 100644
--- a/src/shared/cplusplus/Semantic.h
+++ b/src/shared/cplusplus/Semantic.h
@@ -84,6 +84,9 @@ public:
Name *check(NestedNameSpecifierAST *name, Scope *scope);
+ bool skipFunctionBodies() const;
+ void setSkipFunctionBodies(bool skipFunctionBodies);
+
int currentVisibility() const;
int switchVisibility(int visibility);