зеркало из https://github.com/mozilla/gecko-dev.git
Bug 551286: Add a per function 'final' keyword in C++. r=tglek
This commit is contained in:
Родитель
68550db554
Коммит
4bc037366d
|
@ -7,6 +7,30 @@ function process_type(c)
|
|||
}
|
||||
}
|
||||
|
||||
function process_function(decl, body)
|
||||
{
|
||||
if (!decl.memberOf)
|
||||
return;
|
||||
|
||||
let c = decl.memberOf;
|
||||
if ((c.kind == 'class' || c.kind == 'struct') && !c.isIncomplete) {
|
||||
for each (let base in ancestorTypes(c))
|
||||
for each (let member in base.members)
|
||||
if (member.isFunction && isFinal(member) && member.shortName == decl.shortName)
|
||||
error("Function '" + decl.name + "' overrides final ancestor in '" +
|
||||
base.name + "'.", c.loc);
|
||||
}
|
||||
}
|
||||
|
||||
function ancestorTypes(c)
|
||||
{
|
||||
for each (let base in c.bases) {
|
||||
yield base.type;
|
||||
for (let bb in ancestorTypes(base.type))
|
||||
yield bb;
|
||||
}
|
||||
}
|
||||
|
||||
function isFinal(c)
|
||||
{
|
||||
if (c.isIncomplete)
|
||||
|
|
|
@ -49,6 +49,8 @@ include $(DEPTH)/config/autoconf.mk
|
|||
FINAL_FAILURE_TESTCASES = \
|
||||
TestFinal.cpp \
|
||||
TestFinalTemplate.cpp \
|
||||
TestFinalFunction.cpp \
|
||||
TestFinalGrandparentFunction.cpp \
|
||||
$(NULL)
|
||||
|
||||
STACK_FAILURE_TESTCASES = \
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
#include "nscore.h"
|
||||
|
||||
class Base {
|
||||
virtual void NS_FINAL final() {}
|
||||
};
|
||||
|
||||
class Derived : public Base {
|
||||
virtual void final() {}
|
||||
};
|
|
@ -0,0 +1,12 @@
|
|||
#include "nscore.h"
|
||||
|
||||
class Base {
|
||||
virtual void NS_FINAL final() {}
|
||||
};
|
||||
|
||||
class Derived : public Base {
|
||||
};
|
||||
|
||||
class VeryDerived : public Derived {
|
||||
void final() {}
|
||||
};
|
Загрузка…
Ссылка в новой задаче