Repository: systemml
Updated Branches:
  refs/heads/master d9c09e771 -> be3e0c993


[SYSTEMML-1949] Fix robustness builtin functions w/ missing assignment

This patch fixes NPE issues on compiling scripts that call builtin
functions but miss the assignment of the expression output to
left-hand-side variables. Furthermore, this also includes some minor
refactoring and additional tests.


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/be3e0c99
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/be3e0c99
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/be3e0c99

Branch: refs/heads/master
Commit: be3e0c993d2aa59f80f7c39ec1fd1f17d7f730b0
Parents: d9c09e7
Author: Matthias Boehm <mboe...@gmail.com>
Authored: Mon Oct 9 19:27:18 2017 -0700
Committer: Matthias Boehm <mboe...@gmail.com>
Committed: Mon Oct 9 19:27:18 2017 -0700

----------------------------------------------------------------------
 .../org/apache/sysml/parser/StatementBlock.java | 380 +++++++++----------
 .../misc/InvalidBuiltinFunctionCallTest.java    |  58 +++
 .../misc/InvalidBuiltinFunctionCallTest1.dml    |  24 ++
 .../functions/misc/ZPackageSuite.java           |   1 +
 4 files changed, 266 insertions(+), 197 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/be3e0c99/src/main/java/org/apache/sysml/parser/StatementBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/StatementBlock.java 
b/src/main/java/org/apache/sysml/parser/StatementBlock.java
index 1536bbc..d901119 100644
--- a/src/main/java/org/apache/sysml/parser/StatementBlock.java
+++ b/src/main/java/org/apache/sysml/parser/StatementBlock.java
@@ -545,24 +545,19 @@ public class StatementBlock extends LiveVariableAnalysis 
implements ParseInfo
                throws LanguageException, ParseException, IOException
        {
                _constVarsIn.putAll(constVars);
-               HashMap<String, ConstIdentifier> currConstVars = new 
HashMap<String,ConstIdentifier>();
-               currConstVars.putAll(constVars);
-
                _statements = rewriteFunctionCallStatements(dmlProg, 
_statements);
                _dmlProg = dmlProg;
-
-               for (Statement current : _statements){
-
-                       if (current instanceof OutputStatement){
+               
+               HashMap<String, ConstIdentifier> currConstVars = new 
HashMap<String,ConstIdentifier>(constVars);
+               for (Statement current : _statements) {
+                       if (current instanceof OutputStatement) {
                                OutputStatement os = (OutputStatement)current;
-
                                // validate variable being written by output 
statement exists
                                DataIdentifier target = 
(DataIdentifier)os.getIdentifier();
                                if (ids.getVariable(target.getName()) == null) {
                                        //undefined variables are always 
treated unconditionally as error in order to prevent common script-level bugs
                                        raiseValidateError("Undefined Variable 
(" + target.getName() + ") used in statement", false, 
LanguageErrorCodes.INVALID_PARAMETERS);
                                }
-
                                if ( 
ids.getVariable(target.getName()).getDataType() == DataType.SCALAR) {
                                        boolean paramsOkay = true;
                                        for (String key : 
os.getSource().getVarParams().keySet()){
@@ -577,197 +572,18 @@ public class StatementBlock extends LiveVariableAnalysis 
implements ParseInfo
                                Expression source = os.getSource();
                                source.setOutput(target);
                                source.validateExpression(ids.getVariables(), 
currConstVars, conditional);
-
                                setStatementFormatType(os, conditional);
                                
target.setDimensionValueProperties(ids.getVariable(target.getName()));
                        }
-
                        else if (current instanceof AssignmentStatement){
-                               AssignmentStatement as = 
(AssignmentStatement)current;
-                               DataIdentifier target = as.getTarget();
-                               Expression source = as.getSource();
-
-                               if (source instanceof FunctionCallIdentifier) {
-                                       ((FunctionCallIdentifier) 
source).validateExpression(dmlProg, ids.getVariables(),currConstVars, 
conditional);
-                               }
-                               else {
-                                       if( MLContextProxy.isActive() )
-                                               
MLContextProxy.setAppropriateVarsForRead(source, target._name);
-
-                                       
source.validateExpression(ids.getVariables(), currConstVars, conditional);
-                               }
-
-                               if (source instanceof DataExpression && 
((DataExpression)source).getOpCode() == Expression.DataOp.READ)
-                                       setStatementFormatType(as, conditional);
-
-                               // Handle const vars: (a) basic constant 
propagation, and (b) transitive constant propagation over assignments
-                               if (target != null) {
-                                       currConstVars.remove(target.getName());
-                                       if(source instanceof ConstIdentifier && 
!(target instanceof IndexedIdentifier)){ //basic
-                                               
currConstVars.put(target.getName(), (ConstIdentifier)source);
-                                       }
-                                       if( source instanceof DataIdentifier && 
!(target instanceof IndexedIdentifier) ){ //transitive
-                                               DataIdentifier diSource = 
(DataIdentifier) source;
-                                               if( 
currConstVars.containsKey(diSource.getName()) ){
-                                                       
currConstVars.put(target.getName(), currConstVars.get(diSource.getName()));
-                                               }
-                                       }
-                               }
-
-                               if (source instanceof 
BuiltinFunctionExpression){
-                                       BuiltinFunctionExpression bife = 
(BuiltinFunctionExpression)source;
-                                       if (   bife.getOpCode() == 
Expression.BuiltinFunctionOp.NROW
-                                               || bife.getOpCode() == 
Expression.BuiltinFunctionOp.NCOL )
-                                       {
-                                               DataIdentifier id = 
(DataIdentifier)bife.getFirstExpr();
-                                               DataIdentifier currVal = 
ids.getVariable(id.getName());
-                                               if (currVal == null){
-                                                       //undefined variables 
are always treated unconditionally as error in order to prevent common 
script-level bugs
-                                                       
bife.raiseValidateError("Undefined Variable (" + id.getName() + ") used in 
statement", false, LanguageErrorCodes.INVALID_PARAMETERS);
-                                               }
-                                               IntIdentifier intid = null;
-                                               if (bife.getOpCode() == 
Expression.BuiltinFunctionOp.NROW) {
-                                                       intid = new 
IntIdentifier((currVal instanceof IndexedIdentifier)
-                                                                       ? 
((IndexedIdentifier) currVal).getOrigDim1() : currVal.getDim1(), bife);
-                                               } else {
-                                                       intid = new 
IntIdentifier((currVal instanceof IndexedIdentifier)
-                                                                       ? 
((IndexedIdentifier) currVal).getOrigDim2() : currVal.getDim2(), bife);
-                                               }
-
-                                               // handle case when nrow / ncol 
called on variable with size unknown (dims == -1)
-                                               //      --> const prop NOT 
possible
-                                               if (intid.getValue() != -1){
-                                                       
currConstVars.put(target.getName(), intid);
-                                               }
-                                       }
-                               }
-                               if (target == null) {
-                                       // function has no return value
-                               }
-                               // CASE: target NOT indexed identifier
-                               else if (!(target instanceof 
IndexedIdentifier)){
-                                       
target.setProperties(source.getOutput());
-                                       if (source.getOutput() instanceof 
IndexedIdentifier){
-                                               
target.setDimensions(source.getOutput().getDim1(), 
source.getOutput().getDim2());
-                                       }
-
-                               }
-                               // CASE: target is indexed identifier
-                               else
-                               {
-                                       // process the "target" being indexed
-                                       DataIdentifier targetAsSeen = 
ids.getVariable(target.getName());
-                                       if (targetAsSeen == null){
-                                               
target.raiseValidateError("cannot assign value to indexed identifier " + 
target.toString() + " without first initializing " + target.getName(), 
conditional);
-                                       }
-                                       target.setProperties(targetAsSeen);
-
-                                       // process the expressions for the 
indexing
-                                       if ( 
((IndexedIdentifier)target).getRowLowerBound() != null  )
-                                               
((IndexedIdentifier)target).getRowLowerBound().validateExpression(ids.getVariables(),
 currConstVars, conditional);
-                                       if ( 
((IndexedIdentifier)target).getRowUpperBound() != null  )
-                                               
((IndexedIdentifier)target).getRowUpperBound().validateExpression(ids.getVariables(),
 currConstVars, conditional);
-                                       if ( 
((IndexedIdentifier)target).getColLowerBound() != null  )
-                                               
((IndexedIdentifier)target).getColLowerBound().validateExpression(ids.getVariables(),
 currConstVars, conditional);
-                                       if ( 
((IndexedIdentifier)target).getColUpperBound() != null  )
-                                               
((IndexedIdentifier)target).getColUpperBound().validateExpression(ids.getVariables(),
 currConstVars, conditional);
-
-                                       // validate that LHS indexed identifier 
is being assigned a matrix value
-//                                     if (source.getOutput().getDataType() != 
Expression.DataType.MATRIX){
-//                                             
LOG.error(target.printErrorLocation() + "Indexed expression " + 
target.toString() + " can only be assigned matrix value");
-//                                             throw new 
LanguageException(target.printErrorLocation() + "Indexed expression " + 
target.toString() + " can only be assigned matrix value");
-//                                     }
-
-                                       // validate that size of LHS index 
ranges is being assigned:
-                                       //      (a) a matrix value of same size 
as LHS
-                                       //      (b) singleton value (semantics: 
initialize enitre submatrix with this value)
-                                       IndexPair targetSize = 
((IndexedIdentifier)target).calculateIndexedDimensions(ids.getVariables(), 
currConstVars, conditional);
-
-                                       if (targetSize._row >= 1 && 
source.getOutput().getDim1() > 1 && targetSize._row != 
source.getOutput().getDim1()){
-                                               
target.raiseValidateError("Dimension mismatch. Indexed expression " + 
target.toString() + " can only be assigned matrix with dimensions "
-                                                               + 
targetSize._row + " rows and " + targetSize._col + " cols. Attempted to assign 
matrix with dimensions "
-                                                               + 
source.getOutput().getDim1() + " rows and " + source.getOutput().getDim2() + " 
cols ", conditional);
-                                       }
-
-                                       if (targetSize._col >= 1 && 
source.getOutput().getDim2() > 1 && targetSize._col != 
source.getOutput().getDim2()){
-                                               
target.raiseValidateError("Dimension mismatch. Indexed expression " + 
target.toString() + " can only be assigned matrix with dimensions "
-                                                               + 
targetSize._row + " rows and " + targetSize._col + " cols. Attempted to assign 
matrix with dimensions "
-                                                               + 
source.getOutput().getDim1() + " rows and " + source.getOutput().getDim2() + " 
cols ", conditional);
-                                       }
-
-                                       
((IndexedIdentifier)target).setDimensions(targetSize._row, targetSize._col);
-                               }
-
-                               if (target != null) {
-                                       ids.addVariable(target.getName(), 
target);
-                               }
-
+                               validateAssignmentStatement(current, dmlProg, 
ids, currConstVars, conditional);
                        }
-
                        else if (current instanceof MultiAssignmentStatement){
-                               MultiAssignmentStatement mas = 
(MultiAssignmentStatement) current;
-                               ArrayList<DataIdentifier> targetList = 
mas.getTargetList();
-
-                               // perform validation of source expression
-                               Expression source = mas.getSource();
-                               /*
-                                * MultiAssignmentStatments currently supports 
only External,
-                                * User-defined, and Multi-return Builtin 
function expressions
-                                */
-                               if (!(source instanceof DataIdentifier)
-                                               || (source instanceof 
DataIdentifier && !((DataIdentifier)source).multipleReturns()) ) {
-                               //if (!(source instanceof 
FunctionCallIdentifier) ) {
-                                               //|| !(source instanceof 
BuiltinFunctionExpression && 
((BuiltinFunctionExpression)source).isMultiReturnBuiltinFunction()) ){
-                                       source.raiseValidateError("can only use 
user-defined functions with multi-assignment statement", conditional);
-                               }
-
-                               if ( source instanceof FunctionCallIdentifier) {
-                                       FunctionCallIdentifier fci = 
(FunctionCallIdentifier)source;
-                                       fci.validateExpression(dmlProg, 
ids.getVariables(), currConstVars, conditional);
-                               }
-                               else if ( (source instanceof 
BuiltinFunctionExpression || source instanceof 
ParameterizedBuiltinFunctionExpression)
-                                               && 
((DataIdentifier)source).multipleReturns()) {
-                                       source.validateExpression(mas, 
ids.getVariables(), currConstVars, conditional);
-                               }
-                               else
-                                       throw new LanguageException("Unexpected 
error.");
-
-
-                               if ( source instanceof FunctionCallIdentifier ) 
{
-                                       for (int j =0; j< targetList.size(); 
j++){
-
-                                               DataIdentifier target = 
targetList.get(j);
-                                                       // set target 
properties (based on type info in function call statement return params)
-                                                       FunctionCallIdentifier 
fci = (FunctionCallIdentifier)source;
-                                                       FunctionStatement fstmt 
= (FunctionStatement)_dmlProg.getFunctionStatementBlock(fci.getNamespace(), 
fci.getName()).getStatement(0);
-                                                       if (fstmt == null){
-                                                               
fci.raiseValidateError(" function " + fci.getName() + " is undefined in 
namespace " + fci.getNamespace(), conditional);
-                                                       }
-                                                       if (!(target instanceof 
IndexedIdentifier)){
-                                                               
target.setProperties(fstmt.getOutputParams().get(j));
-                                                       }
-                                                       else{
-                                                               DataIdentifier 
targetAsSeen = ids.getVariable(target.getName());
-                                                               if 
(targetAsSeen == null){
-                                                                       
raiseValidateError(target.printErrorLocation() + "cannot assign value to 
indexed identifier " + target.toString() + " without first initializing " + 
target.getName(), conditional);
-                                                               }
-                                                               
target.setProperties(targetAsSeen);
-                                                       }
-                                                       
ids.addVariable(target.getName(), target);
-                                       }
-                               }
-                               else if ( source instanceof 
BuiltinFunctionExpression || source instanceof 
ParameterizedBuiltinFunctionExpression ) {
-                                       Identifier[] outputs = 
source.getOutputs();
-                                       for (int j=0; j < targetList.size(); 
j++) {
-                                               
ids.addVariable(targetList.get(j).getName(), (DataIdentifier)outputs[j]);
-                                       }
-                               }
+                               validateMultiAssignmentStatement(current, 
dmlProg, ids, currConstVars, conditional);
                        }
-
                        else if(current instanceof ForStatement || current 
instanceof IfStatement || current instanceof WhileStatement ){
                                raiseValidateError("control statement 
(WhileStatement, IfStatement, ForStatement) should not be in generic statement 
block. Likely a parsing error", conditional);
                        }
-
                        else if (current instanceof PrintStatement) {
                                PrintStatement pstmt = (PrintStatement) current;
                                List<Expression> expressions = 
pstmt.getExpressions();
@@ -782,22 +598,192 @@ public class StatementBlock extends LiveVariableAnalysis 
implements ParseInfo
                                        }
                                }
                        }
-
                        // no work to perform for PathStatement or 
ImportStatement
                        else if (current instanceof PathStatement){}
                        else if (current instanceof ImportStatement){}
-
-
                        else {
                                raiseValidateError("cannot process statement of 
type " + current.getClass().getSimpleName(), conditional);
                        }
-
-               } // end for (Statement current : _statements){
+               }
                _constVarsOut.putAll(currConstVars);
                return ids;
-
        }
-
+       
+       private void validateAssignmentStatement(Statement current, DMLProgram 
dmlProg, 
+               VariableSet ids, HashMap<String, ConstIdentifier> 
currConstVars, boolean conditional) 
+                       throws LanguageException, IOException, ParseException 
+       {
+               AssignmentStatement as = (AssignmentStatement)current;
+               DataIdentifier target = as.getTarget();
+               Expression source = as.getSource();
+               
+               if (source instanceof FunctionCallIdentifier) {
+                       ((FunctionCallIdentifier) source).validateExpression(
+                               dmlProg, ids.getVariables(),currConstVars, 
conditional);
+               }
+               else { //all builtin functions and expressions
+                       if( target == null  )
+                               raiseValidateError("Missing variable 
assignment.", false);
+                       
+                       if( MLContextProxy.isActive() )
+                               
MLContextProxy.setAppropriateVarsForRead(source, target._name);
+                       
+                       source.validateExpression(ids.getVariables(), 
currConstVars, conditional);
+               }
+               
+               if (source instanceof DataExpression && 
((DataExpression)source).getOpCode() == Expression.DataOp.READ)
+                       setStatementFormatType(as, conditional);
+               
+               // Handle const vars: (a) basic constant propagation, and (b) 
transitive constant propagation over assignments
+               if (target != null) {
+                       currConstVars.remove(target.getName());
+                       if(source instanceof ConstIdentifier && !(target 
instanceof IndexedIdentifier)){ //basic
+                               currConstVars.put(target.getName(), 
(ConstIdentifier)source);
+                       }
+                       if( source instanceof DataIdentifier && !(target 
instanceof IndexedIdentifier) ){ //transitive
+                               DataIdentifier diSource = (DataIdentifier) 
source;
+                               if( 
currConstVars.containsKey(diSource.getName()) ){
+                                       currConstVars.put(target.getName(), 
currConstVars.get(diSource.getName()));
+                               }
+                       }
+               }
+               
+               if (source instanceof BuiltinFunctionExpression){
+                       BuiltinFunctionExpression bife = 
(BuiltinFunctionExpression)source;
+                       if (   bife.getOpCode() == 
Expression.BuiltinFunctionOp.NROW
+                               || bife.getOpCode() == 
Expression.BuiltinFunctionOp.NCOL )
+                       {
+                               DataIdentifier id = 
(DataIdentifier)bife.getFirstExpr();
+                               DataIdentifier currVal = 
ids.getVariable(id.getName());
+                               if (currVal == null){
+                                       //undefined variables are always 
treated unconditionally as error in order to prevent common script-level bugs
+                                       bife.raiseValidateError("Undefined 
Variable (" + id.getName() + ") used in statement", false, 
LanguageErrorCodes.INVALID_PARAMETERS);
+                               }
+                               IntIdentifier intid = null;
+                               if (bife.getOpCode() == 
Expression.BuiltinFunctionOp.NROW) {
+                                       intid = new IntIdentifier((currVal 
instanceof IndexedIdentifier)
+                                                       ? ((IndexedIdentifier) 
currVal).getOrigDim1() : currVal.getDim1(), bife);
+                               } else {
+                                       intid = new IntIdentifier((currVal 
instanceof IndexedIdentifier)
+                                                       ? ((IndexedIdentifier) 
currVal).getOrigDim2() : currVal.getDim2(), bife);
+                               }
+                               
+                               // handle case when nrow / ncol called on 
variable with size unknown (dims == -1)
+                               //      --> const prop NOT possible
+                               if (intid.getValue() != -1)
+                                       currConstVars.put(target.getName(), 
intid);
+                       }
+               }
+               if (target == null) {
+                       // function has no return value
+               }
+               // CASE: target NOT indexed identifier
+               else if (!(target instanceof IndexedIdentifier)){
+                       target.setProperties(source.getOutput());
+                       if (source.getOutput() instanceof IndexedIdentifier)
+                               
target.setDimensions(source.getOutput().getDim1(), 
source.getOutput().getDim2());
+               }
+               // CASE: target is indexed identifier
+               else
+               {
+                       // process the "target" being indexed
+                       DataIdentifier targetAsSeen = 
ids.getVariable(target.getName());
+                       if (targetAsSeen == null){
+                               target.raiseValidateError("cannot assign value 
to indexed identifier " + target.toString() + " without first initializing " + 
target.getName(), conditional);
+                       }
+                       target.setProperties(targetAsSeen);
+                       
+                       // process the expressions for the indexing
+                       if ( ((IndexedIdentifier)target).getRowLowerBound() != 
null  )
+                               
((IndexedIdentifier)target).getRowLowerBound().validateExpression(ids.getVariables(),
 currConstVars, conditional);
+                       if ( ((IndexedIdentifier)target).getRowUpperBound() != 
null  )
+                               
((IndexedIdentifier)target).getRowUpperBound().validateExpression(ids.getVariables(),
 currConstVars, conditional);
+                       if ( ((IndexedIdentifier)target).getColLowerBound() != 
null  )
+                               
((IndexedIdentifier)target).getColLowerBound().validateExpression(ids.getVariables(),
 currConstVars, conditional);
+                       if ( ((IndexedIdentifier)target).getColUpperBound() != 
null  )
+                               
((IndexedIdentifier)target).getColUpperBound().validateExpression(ids.getVariables(),
 currConstVars, conditional);
+                       
+                       // validate that size of LHS index ranges is being 
assigned:
+                       //      (a) a matrix value of same size as LHS
+                       //      (b) singleton value (semantics: initialize 
enitre submatrix with this value)
+                       IndexPair targetSize = 
((IndexedIdentifier)target).calculateIndexedDimensions(ids.getVariables(), 
currConstVars, conditional);
+                       
+                       if (targetSize._row >= 1 && 
source.getOutput().getDim1() > 1 && targetSize._row != 
source.getOutput().getDim1()){
+                               target.raiseValidateError("Dimension mismatch. 
Indexed expression " + target.toString() + " can only be assigned matrix with 
dimensions "
+                                               + targetSize._row + " rows and 
" + targetSize._col + " cols. Attempted to assign matrix with dimensions "
+                                               + source.getOutput().getDim1() 
+ " rows and " + source.getOutput().getDim2() + " cols ", conditional);
+                       }
+                       
+                       if (targetSize._col >= 1 && 
source.getOutput().getDim2() > 1 && targetSize._col != 
source.getOutput().getDim2()){
+                               target.raiseValidateError("Dimension mismatch. 
Indexed expression " + target.toString() + " can only be assigned matrix with 
dimensions "
+                                               + targetSize._row + " rows and 
" + targetSize._col + " cols. Attempted to assign matrix with dimensions "
+                                               + source.getOutput().getDim1() 
+ " rows and " + source.getOutput().getDim2() + " cols ", conditional);
+                       }
+                       
((IndexedIdentifier)target).setDimensions(targetSize._row, targetSize._col);
+               }
+               
+               if (target != null)
+                       ids.addVariable(target.getName(), target);
+       }
+       
+       private void validateMultiAssignmentStatement(Statement current, 
DMLProgram dmlProg, 
+               VariableSet ids, HashMap<String, ConstIdentifier> 
currConstVars, boolean conditional) 
+                       throws LanguageException, IOException 
+       {
+               MultiAssignmentStatement mas = (MultiAssignmentStatement) 
current;
+               ArrayList<DataIdentifier> targetList = mas.getTargetList();
+               Expression source = mas.getSource();
+               
+               //MultiAssignmentStatments currently supports only External,
+               //User-defined, and Multi-return Builtin function expressions
+               if (!(source instanceof DataIdentifier)
+                               || (source instanceof DataIdentifier && 
!((DataIdentifier)source).multipleReturns()) ) {
+                       source.raiseValidateError("can only use user-defined 
functions with multi-assignment statement", conditional);
+               }
+               if ( source instanceof FunctionCallIdentifier) {
+                       FunctionCallIdentifier fci = 
(FunctionCallIdentifier)source;
+                       fci.validateExpression(dmlProg, ids.getVariables(), 
currConstVars, conditional);
+               }
+               else if ( (source instanceof BuiltinFunctionExpression || 
source instanceof ParameterizedBuiltinFunctionExpression)
+                               && ((DataIdentifier)source).multipleReturns()) {
+                       source.validateExpression(mas, ids.getVariables(), 
currConstVars, conditional);
+               }
+               else
+                       throw new LanguageException("Unexpected error.");
+               
+               if ( source instanceof FunctionCallIdentifier ) {
+                       for (int j =0; j< targetList.size(); j++) {
+                               DataIdentifier target = targetList.get(j);
+                               // set target properties (based on type info in 
function call statement return params)
+                               FunctionCallIdentifier fci = 
(FunctionCallIdentifier)source;
+                               FunctionStatement fstmt = 
(FunctionStatement)_dmlProg
+                                       
.getFunctionStatementBlock(fci.getNamespace(), fci.getName()).getStatement(0);
+                               if (fstmt == null){
+                                       fci.raiseValidateError(" function " + 
fci.getName() 
+                                               + " is undefined in namespace " 
+ fci.getNamespace(), conditional);
+                               }
+                               if (!(target instanceof IndexedIdentifier)){
+                                       
target.setProperties(fstmt.getOutputParams().get(j));
+                               }
+                               else{
+                                       DataIdentifier targetAsSeen = 
ids.getVariable(target.getName());
+                                       if (targetAsSeen == null){
+                                               
raiseValidateError(target.printErrorLocation() + "cannot assign value to 
indexed identifier " 
+                                                       + target.toString() + " 
without first initializing " + target.getName(), conditional);
+                                       }
+                                       target.setProperties(targetAsSeen);
+                               }
+                               ids.addVariable(target.getName(), target);
+                       }
+               }
+               else if ( source instanceof BuiltinFunctionExpression || source 
instanceof ParameterizedBuiltinFunctionExpression ) {
+                       Identifier[] outputs = source.getOutputs();
+                       for (int j=0; j < targetList.size(); j++) {
+                               ids.addVariable(targetList.get(j).getName(), 
(DataIdentifier)outputs[j]);
+                       }
+               }
+       }
+       
        public void setStatementFormatType(OutputStatement s, boolean 
conditionalValidate)
                throws LanguageException, ParseException
        {

http://git-wip-us.apache.org/repos/asf/systemml/blob/be3e0c99/src/test/java/org/apache/sysml/test/integration/functions/misc/InvalidBuiltinFunctionCallTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/sysml/test/integration/functions/misc/InvalidBuiltinFunctionCallTest.java
 
b/src/test/java/org/apache/sysml/test/integration/functions/misc/InvalidBuiltinFunctionCallTest.java
new file mode 100644
index 0000000..f755752
--- /dev/null
+++ 
b/src/test/java/org/apache/sysml/test/integration/functions/misc/InvalidBuiltinFunctionCallTest.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sysml.test.integration.functions.misc;
+
+import org.junit.Test;
+
+import org.apache.sysml.api.DMLException;
+import org.apache.sysml.test.integration.AutomatedTestBase;
+import org.apache.sysml.test.integration.TestConfiguration;
+import org.apache.sysml.test.utils.TestUtils;
+
+public class InvalidBuiltinFunctionCallTest extends AutomatedTestBase
+{
+       private final static String TEST_DIR = "functions/misc/";
+       private final static String TEST_NAME1 = 
"InvalidBuiltinFunctionCallTest1";
+       private final static String TEST_CLASS_DIR = TEST_DIR + 
InvalidBuiltinFunctionCallTest.class.getSimpleName() + "/";
+       
+       @Override
+       public void setUp() {
+               TestUtils.clearAssertionInformation();
+               addTestConfiguration(TEST_NAME1, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME1, new String[] {}));
+       }
+       
+       @Test
+       public void testInvalidBuiltinFunctionCall1() { 
+               runTest( TEST_NAME1, true ); 
+       }
+       
+       private void runTest( String testName, boolean expected ) 
+       {
+               TestConfiguration config = getTestConfiguration(testName);
+               loadTestConfiguration(config);
+               
+               String HOME = SCRIPT_DIR + TEST_DIR;
+               fullDMLScriptName = HOME + testName + ".dml";
+               programArgs = new String[]{};
+               
+               //run tests
+               runTest(true, expected, DMLException.class, -1);
+       }
+}

http://git-wip-us.apache.org/repos/asf/systemml/blob/be3e0c99/src/test/scripts/functions/misc/InvalidBuiltinFunctionCallTest1.dml
----------------------------------------------------------------------
diff --git 
a/src/test/scripts/functions/misc/InvalidBuiltinFunctionCallTest1.dml 
b/src/test/scripts/functions/misc/InvalidBuiltinFunctionCallTest1.dml
new file mode 100644
index 0000000..5ddbbe0
--- /dev/null
+++ b/src/test/scripts/functions/misc/InvalidBuiltinFunctionCallTest1.dml
@@ -0,0 +1,24 @@
+#-------------------------------------------------------------
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#-------------------------------------------------------------
+
+X = rand(rows=1006, cols=784, sparsity=0.001);
+removeEmpty(target=X, margin="rows");
+print("nrow(X): " + nrow(X));

http://git-wip-us.apache.org/repos/asf/systemml/blob/be3e0c99/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java
----------------------------------------------------------------------
diff --git 
a/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java
 
b/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java
index 52f71f8..e3833f4 100644
--- 
a/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java
+++ 
b/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java
@@ -32,6 +32,7 @@ import org.junit.runners.Suite;
        FunctionInliningTest.class,
        FunctionNamespaceTest.class,
        IfTest.class,
+       InvalidBuiltinFunctionCallTest.class,
        InvalidFunctionAssignmentTest.class,
        InvalidFunctionSignatureTest.class,
        IPAConstantFoldingScalarVariablePropagationTest.class,

Reply via email to