[svn] r7236: nemerle/trunk/ncc: hierarchy/TypeBuilder.n
testsuite/negative/abstract.n typing/Typer2.n
nazgul
svnadmin at nemerle.org
Tue Jan 9 23:31:27 CET 2007
Log:
Disallow calling base abstract members
Author: nazgul
Date: Tue Jan 9 23:31:24 2007
New Revision: 7236
Added:
nemerle/trunk/ncc/testsuite/negative/abstract.n
Modified:
nemerle/trunk/ncc/hierarchy/TypeBuilder.n
nemerle/trunk/ncc/typing/Typer2.n
Modified: nemerle/trunk/ncc/hierarchy/TypeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeBuilder.n (original)
+++ nemerle/trunk/ncc/hierarchy/TypeBuilder.n Tue Jan 9 23:31:24 2007
@@ -2315,7 +2315,8 @@
..$attrs $(meth_header.name : usesite)
(..$(meth_parms)) : $(meth_header.ret_type : typed)
{
- base.$(meth_header.name : usesite) (..$meth_call_parms)
+ $(if (meth.Attributes %&& NemerleAttributes.Abstract) <[ null : this ]> else <[ base ]>).
+ $(meth_header.name : usesite) (..$meth_call_parms)
}
]>) :> MethodBuilder;
Added: nemerle/trunk/ncc/testsuite/negative/abstract.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/ncc/testsuite/negative/abstract.n Tue Jan 9 23:31:24 2007
@@ -0,0 +1,22 @@
+abstract class A {
+ public abstract foo1 () : void;
+
+ public abstract bar : int { get; }
+
+ public abstract wee : int { set; }
+}
+
+
+class B : A {
+ public override foo1 () : void {
+ base.foo1 (); // E: cannot call an abstract base method A.foo1
+ }
+
+ public override bar : int {
+ get { base.bar } // E: cannot call an abstract base method A.get_bar
+ }
+ public override wee : int {
+ set { base.wee = value } // E: cannot call an abstract base method A.set_wee
+ }
+}
+
Modified: nemerle/trunk/ncc/typing/Typer2.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer2.n (original)
+++ nemerle/trunk/ncc/typing/Typer2.n Tue Jan 9 23:31:24 2007
@@ -892,8 +892,13 @@
// for setters the argument list is fixed later
def ty = obj.Type.Fix ().TypeOfMember (meth);
+ def is_base = IsBaseRef (obj);
// Message.Debug ($ "prop $meth ty=$ty $obj $(IsBaseRef (obj))");
- def the_ref = TExpr.MethodRef (ty, obj, meth, [], IsBaseRef (obj));
+
+ when (is_base && meth.Attributes %&& NemerleAttributes.Abstract)
+ ReportError (messenger, $"cannot call an abstract base $meth");
+
+ def the_ref = TExpr.MethodRef (ty, obj, meth, [], is_base);
if (ctx %&& Context.IsIndexerRef)
the_ref
else if (prop.IsIndexer) {
@@ -950,10 +955,14 @@
| TExpr.MethodRef (obj, meth, type_parms, notvirt) =>
MarkAsUsed (meth, expr.Location);
- def notvirt = notvirt || IsBaseRef (obj);
+ def is_base = IsBaseRef (obj);
+ def notvirt = notvirt || is_base;
//Message.Debug ($"$(ctx %&& (Context.IsCalledValue | Context.IsDelegeteCtorParm)) obj=$(obj.GetType())/$obj ");
+ when (is_base && meth.Attributes %&& NemerleAttributes.Abstract)
+ ReportError (messenger, $"cannot call an abstract base $meth");
+
CheckTypeArguments(expr.Location, meth, type_parms);
if (ctx %&& (Context.IsCalledValue | Context.IsDelegeteCtorParm))
TExpr.MethodRef (Walk (obj), meth, type_parms, notvirt)
More information about the svn
mailing list