--- /dev/null
+--TEST--\r
+Returning a reference from a function\r
+--FILE--\r
+<?php\r
+\r
+function &returnByRef(&$arg1)\r
+{\r
+ return $arg1;\r
+}\r
+\r
+$a = 7;\r
+$b =& returnByRef($a);\r
+var_dump($b);\r
+$a++;\r
+var_dump($b);\r
+\r
+?>\r
+--EXPECT--\r
+int(7)\r
+int(8)
\ No newline at end of file
--- /dev/null
+--TEST--\r
+Returning a reference from a function.\r
+--FILE--\r
+<?php\r
+function &returnRef() {\r
+ global $a;\r
+ return $a;\r
+}\r
+\r
+function returnVal() {\r
+ global $a;\r
+ return $a;\r
+}\r
+\r
+$a = "original";\r
+$b =& returnVal();\r
+$b = "changed";\r
+var_dump($a); //expecting warning + "original" \r
+\r
+$a = "original";\r
+$b =& returnRef();\r
+$b = "changed";\r
+var_dump($a); //expecting "changed" \r
+?>\r
+--EXPECTF--\r
+\r
+Strict Standards: Only variables should be assigned by reference in %s on line 13\r
+string(8) "original"\r
+string(7) "changed"\r
--- /dev/null
+--TEST--\r
+Returning a reference from a function\r
+--FILE--\r
+<?php\r
+function returnConstantByValue() {\r
+ return 100;\r
+}\r
+\r
+function &returnConstantByRef() {\r
+ return 100;\r
+}\r
+\r
+function &returnVariableByRef() {\r
+ return $GLOBALS['a'];\r
+}\r
+\r
+echo "\n---> 1. Trying to assign by reference the return value of a function that returns by value:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &returnConstantByValue();\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 2. Trying to assign by reference the return value of a function that returns a constant by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &returnConstantByRef();\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 3. Trying to assign by reference the return value of a function that returns by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &returnVariableByRef();\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+?>\r
+--EXPECTF--\r
+\r
+---> 1. Trying to assign by reference the return value of a function that returns by value:\r
+\r
+Strict Standards: Only variables should be assigned by reference in %s on line 17\r
+int(5)\r
+int(100)\r
+\r
+---> 2. Trying to assign by reference the return value of a function that returns a constant by ref:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line 7\r
+int(5)\r
+int(100)\r
+\r
+---> 3. Trying to assign by reference the return value of a function that returns by ref:\r
+int(5)\r
+int(5)\r
--- /dev/null
+--TEST--\r
+Returning a reference from a static method\r
+--FILE--\r
+<?php\r
+Class C {\r
+ static function returnConstantByValue() {\r
+ return 100;\r
+ }\r
+\r
+ static function &returnConstantByRef() {\r
+ return 100;\r
+ }\r
+ \r
+ static function &returnVariableByRef() {\r
+ return $GLOBALS['a'];\r
+ }\r
+}\r
+\r
+echo "\n---> 1. Trying to assign by reference the return value of a function that returns by value:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &C::returnConstantByValue();\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 2. Trying to assign by reference the return value of a function that returns a constant by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &C::returnConstantByRef();\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 3. Trying to assign by reference the return value of a function that returns by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &C::returnVariableByRef();\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+?>\r
+--EXPECTF--\r
+\r
+---> 1. Trying to assign by reference the return value of a function that returns by value:\r
+\r
+Strict Standards: Only variables should be assigned by reference in %s on line 19\r
+int(5)\r
+int(100)\r
+\r
+---> 2. Trying to assign by reference the return value of a function that returns a constant by ref:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line 8\r
+int(5)\r
+int(100)\r
+\r
+---> 3. Trying to assign by reference the return value of a function that returns by ref:\r
+int(5)\r
+int(5)\r
--- /dev/null
+--TEST--\r
+Returning a reference from a method\r
+--FILE--\r
+<?php\r
+Class C {\r
+ function returnConstantByValue() {\r
+ return 100;\r
+ }\r
+ \r
+ function &returnConstantByRef() {\r
+ return 100;\r
+ }\r
+ \r
+ static function &returnVariableByRef() {\r
+ return $GLOBALS['a'];\r
+ }\r
+}\r
+$c = new C;\r
+\r
+echo "\n---> 1. Trying to assign by reference the return value of a function that returns by value:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &$c->returnConstantByValue();\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 2. Trying to assign by reference the return value of a function that returns a constant by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &$c->returnConstantByRef();\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 3. Trying to assign by reference the return value of a function that returns by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &$c->returnVariableByRef();\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+?>\r
+--EXPECTF--\r
+\r
+---> 1. Trying to assign by reference the return value of a function that returns by value:\r
+\r
+Strict Standards: Only variables should be assigned by reference in %s on line 20\r
+int(5)\r
+int(100)\r
+\r
+---> 2. Trying to assign by reference the return value of a function that returns a constant by ref:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line 8\r
+int(5)\r
+int(100)\r
+\r
+---> 3. Trying to assign by reference the return value of a function that returns by ref:\r
+int(5)\r
+int(5)\r
--- /dev/null
+--TEST--\r
+Returning a reference from a function via another function\r
+--INI--\r
+error_reporting = E_ALL & ~E_STRICT\r
+--FILE--\r
+<?php\r
+function returnConstantByValue() {\r
+ return 100;\r
+}\r
+\r
+function &returnConstantByRef() {\r
+ return 100;\r
+}\r
+\r
+function &returnVariableByRef() {\r
+ return $GLOBALS['a'];\r
+}\r
+\r
+function &returnFunctionCallByRef($functionToCall) {\r
+ return $functionToCall();\r
+}\r
+\r
+echo "\n---> 1. Via a return by ref function call, assign by reference the return value of a function that returns by value:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &returnFunctionCallByRef('returnConstantByValue');\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 2. Via a return by ref function call, assign by reference the return value of a function that returns a constant by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &returnFunctionCallByRef('returnConstantByRef');\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 3. Via a return by ref function call, assign by reference the return value of a function that returns by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &returnFunctionCallByRef('returnVariableByRef');\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+?>\r
+--EXPECTF--\r
+---> 1. Via a return by ref function call, assign by reference the return value of a function that returns by value:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line 15\r
+int(5)\r
+int(100)\r
+\r
+---> 2. Via a return by ref function call, assign by reference the return value of a function that returns a constant by ref:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line 7\r
+int(5)\r
+int(100)\r
+\r
+---> 3. Via a return by ref function call, assign by reference the return value of a function that returns by ref:\r
+int(5)\r
+int(5)\r
--- /dev/null
+--TEST--\r
+Returning a reference from a static method via another static method\r
+--INI--\r
+error_reporting = E_ALL & ~E_STRICT\r
+--FILE--\r
+<?php\r
+class C {\r
+ static function returnConstantByValue() {\r
+ return 100;\r
+ }\r
+ \r
+ static function &returnConstantByRef() {\r
+ return 100;\r
+ }\r
+ \r
+ static function &returnVariableByRef() {\r
+ return $GLOBALS['a'];\r
+ }\r
+ \r
+ static function &returnFunctionCallByRef($functionToCall) {\r
+ return C::$functionToCall();\r
+ }\r
+}\r
+\r
+echo "\n---> 1. Via a return by ref function call, assign by reference the return value of a function that returns by value:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &C::returnFunctionCallByRef('returnConstantByValue');\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 2. Via a return by ref function call, assign by reference the return value of a function that returns a constant by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &C::returnFunctionCallByRef('returnConstantByRef');\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 3. Via a return by ref function call, assign by reference the return value of a function that returns by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &C::returnFunctionCallByRef('returnVariableByRef');\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+?>\r
+--EXPECTF--\r
+\r
+---> 1. Via a return by ref function call, assign by reference the return value of a function that returns by value:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line 16\r
+int(5)\r
+int(100)\r
+\r
+---> 2. Via a return by ref function call, assign by reference the return value of a function that returns a constant by ref:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line 8\r
+int(5)\r
+int(100)\r
+\r
+---> 3. Via a return by ref function call, assign by reference the return value of a function that returns by ref:\r
+int(5)\r
+int(5)
\ No newline at end of file
--- /dev/null
+--TEST--\r
+Returning a reference from a non-static method via another non-static method\r
+--INI--\r
+error_reporting = E_ALL & ~E_STRICT\r
+--FILE--\r
+<?php\r
+class C {\r
+ function returnConstantByValue() {\r
+ return 100;\r
+ }\r
+ \r
+ function &returnConstantByRef() {\r
+ return 100;\r
+ }\r
+ \r
+ function &returnVariableByRef() {\r
+ return $GLOBALS['a'];\r
+ }\r
+ \r
+ function &returnFunctionCallByRef($functionToCall) {\r
+ return $this->$functionToCall();\r
+ }\r
+}\r
+$c = new C;\r
+\r
+echo "\n---> 1. Via a return by ref function call, assign by reference the return value of a function that returns by value:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &$c->returnFunctionCallByRef('returnConstantByValue');\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 2. Via a return by ref function call, assign by reference the return value of a function that returns a constant by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &$c->returnFunctionCallByRef('returnConstantByRef');\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+echo "\n---> 3. Via a return by ref function call, assign by reference the return value of a function that returns by ref:\n";\r
+unset($a, $b);\r
+$a = 4;\r
+$b = &$c->returnFunctionCallByRef('returnVariableByRef');\r
+$a++;\r
+var_dump($a, $b);\r
+\r
+?>\r
+--EXPECTF--\r
+\r
+---> 1. Via a return by ref function call, assign by reference the return value of a function that returns by value:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line 16\r
+int(5)\r
+int(100)\r
+\r
+---> 2. Via a return by ref function call, assign by reference the return value of a function that returns a constant by ref:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line 8\r
+int(5)\r
+int(100)\r
+\r
+---> 3. Via a return by ref function call, assign by reference the return value of a function that returns by ref:\r
+int(5)\r
+int(5)
\ No newline at end of file
--- /dev/null
+--TEST--\r
+Returning a references returned by another function\r
+--FILE--\r
+<?php\r
+\r
+\r
+function &returnVarByRef () {\r
+ $b=1;\r
+ return $b; \r
+}\r
+\r
+function &testReturnVarByRef() {\r
+ return returnVarByRef();\r
+}\r
+\r
+function returnVal () {\r
+return 1; \r
+}\r
+\r
+function &testReturnValByRef() {\r
+ return returnVal();\r
+}\r
+\r
+echo "\n---> 1. Return a variable by reference -> No warning:\n";\r
+\r
+var_dump (testReturnVarByRef());\r
+\r
+echo "\n---> 2. Return a value by reference -> Warning:\n";\r
+\r
+var_dump (testReturnValByRef());\r
+\r
+--EXPECTF--\r
+---> 1. Return a variable by reference -> No warning:\r
+int(1)\r
+\r
+---> 2. Return a value by reference -> Warning:\r
+\r
+Notice: Only variable references should be returned by reference in %s on line %d\r
+int(1)\r