Bug 551286: Add a per function 'final' keyword in C++. r=tglek

This commit is contained in:
Josh Matthews 2010-03-28 11:44:33 -04:00
Родитель 68550db554
Коммит 4bc037366d
4 изменённых файлов: 47 добавлений и 0 удалений

Просмотреть файл

@ -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() {}
};