summary refs log tree commit diff stats
path: root/compiler/semexprs.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/semexprs.nim')
-rwxr-xr-xcompiler/semexprs.nim45
1 files changed, 1 insertions, 44 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index fe698bffb..fc3ea1820 100755
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -438,51 +438,9 @@ proc skipObjConv(n: PNode): PNode =
       result = n
   of nkObjUpConv, nkObjDownConv: result = n.sons[0]
   else: result = n
-  
-type 
-  TAssignableResult = enum 
-    arNone,                   # no l-value and no discriminant
-    arLValue,                 # is an l-value
-    arLocalLValue,            # is an l-value, but local var; must not escape
-                              # its stack frame!
-    arDiscriminant            # is a discriminant
 
 proc isAssignable(c: PContext, n: PNode): TAssignableResult = 
-  result = arNone
-  case n.kind
-  of nkSym:
-    # don't list 'skLet' here:
-    if n.sym.kind in {skVar, skResult, skTemp}:
-      if c.p.owner.id == n.sym.owner.id and sfGlobal notin n.sym.flags:
-        result = arLocalLValue
-      else:
-        result = arLValue
-  of nkDotExpr: 
-    if skipTypes(n.sons[0].typ, abstractInst).kind in {tyVar, tyPtr, tyRef}: 
-      result = arLValue
-    else: 
-      result = isAssignable(c, n.sons[0])
-    if result != arNone and sfDiscriminant in n.sons[1].sym.flags: 
-      result = arDiscriminant
-  of nkBracketExpr: 
-    if skipTypes(n.sons[0].typ, abstractInst).kind in {tyVar, tyPtr, tyRef}: 
-      result = arLValue
-    else:
-      result = isAssignable(c, n.sons[0])
-  of nkHiddenStdConv, nkHiddenSubConv, nkConv: 
-    # Object and tuple conversions are still addressable, so we skip them
-    # XXX why is 'tyOpenArray' allowed here?
-    if skipTypes(n.typ, abstractPtrs).kind in {tyOpenArray, tyTuple, tyObject}: 
-      result = isAssignable(c, n.sons[1])
-    elif compareTypes(n.typ, n.sons[1].typ, dcEqIgnoreDistinct):
-      # types that are equal modulo distinction preserve l-value:
-      result = isAssignable(c, n.sons[1])
-  of nkHiddenDeref, nkDerefExpr: 
-    result = arLValue
-  of nkObjUpConv, nkObjDownConv, nkCheckedFieldExpr: 
-    result = isAssignable(c, n.sons[0])
-  else: 
-    nil
+  result = parampatterns.isAssignable(c.p.owner, n)
 
 proc newHiddenAddrTaken(c: PContext, n: PNode): PNode = 
   if n.kind == nkHiddenDeref: 
@@ -1598,4 +1556,3 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
     LocalError(n.info, errInvalidExpressionX,
                renderTree(n, {renderNoComments}))
   incl(result.flags, nfSem)
-  result = applyPatterns(c, result)