blob: e5926aa6a6c9520efc55389c4ef3bb7891c4836a [file]
<?php
require "tests.php";
function check_null_rejected($name, $f) {
try {
$f();
check::fail("$name accepted null");
} catch (TypeError $e) {
}
}
// An rvalue reference to an array is passed as a reference to an array, which cannot be null.
check::equal(sum_of(others_address()), 100, "sum_of");
check::equal(first_of(others_unsized_address()), 10, "first_of");
check::equal(items_sum(items_address()), 3, "items_sum");
check_null_rejected("sum_of", fn() => sum_of(null));
check_null_rejected("first_of", fn() => first_of(null));
// An rvalue reference to an array of char is a string.
check::equal(length_of("abc"), 3, "length_of");
check::equal(length_of_writable("xy"), 2, "length_of_writable");
check_null_rejected("length_of", fn() => length_of(null));
// Setting a variable that is an rvalue reference to an array copies into the array it refers to.
check::equal(numbers_sum(), 10, "numbers_sum");
check::set("numbers_rref", others_address());
check::equal(numbers_sum(), 100, "numbers_sum after set");
check::equal(check::get("letters_rref"), "abc", "letters_rref");
check::set("letters_rref", "xy");
check::equal(letters_are(), "xy", "letters_are");
$member = new RvalueRefArrayMember();
check::equal($member->sum(), 10, "member sum");
$member->member_rref = others_address();
check::equal($member->sum(), 100, "member sum after set");
check::equal($member->text_rref, "hi", "member text_rref");
$member->text_rref = "bye";
check::equal($member->text_is(), "bye", "member text_is");
check::done();