[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