parser/field-no-override.test \
parser/field-no-static-class.test \
parser/field-no-virtual.test \
+ parser/foreach.vala \
parser/foreach-no-type.test \
parser/function-syntax-error.test \
parser/inner-array-size.test \
--- /dev/null
+void main () {
+ string[] array = { "foo", "bar", "manam" };
+ foreach (string s in array) {
+ }
+ foreach (unowned string s in array) {
+ }
+ foreach (var s in array) {
+ }
+ foreach (unowned var s in array) {
+ }
+}
checked = true;
+ if (type_reference == null) {
+ type_reference = new VarType ();
+ }
+
// analyze collection expression first, used for type inference
if (!collection.check (context)) {
// ignore inner error
bool analyze_element_type (DataType element_type) {
// analyze element type
- if (type_reference == null) {
+ if (type_reference is VarType) {
// var type
type_reference = element_type.copy ();
+ // FIXME Only follows "unowned var" otherwise inherit ownership of element-type
+ if (!type_reference.value_owned) {
+ type_reference.value_owned = false;
+ }
} else if (!element_type.compatible (type_reference)) {
error = true;
Report.error (source_reference, "Foreach: Cannot convert from `%s' to `%s'", element_type.to_string (), type_reference.to_string ());
bool check_without_iterator (CodeContext context, DataType collection_type, DataType element_type) {
// analyze element type
- if (type_reference == null) {
+ if (type_reference is VarType) {
// var type
type_reference = element_type.copy ();
+ // FIXME Only follows "unowned var" otherwise inherit ownership of element-type
+ if (!type_reference.value_owned) {
+ type_reference.value_owned = false;
+ }
} else if (!element_type.compatible (type_reference)) {
error = true;
Report.error (source_reference, "Foreach: Cannot convert from `%s' to `%s'", element_type.to_string (), type_reference.to_string ());
var begin = get_location ();
expect (TokenType.FOREACH);
expect (TokenType.OPEN_PARENS);
- DataType type = null;
- if (!accept (TokenType.VAR)) {
- type = parse_type (true, true);
- if (accept (TokenType.IN)) {
- Report.error (type.source_reference, "syntax error, expected var or type");
- throw new ParseError.SYNTAX ("expected var or type");
+ var var_or_type = get_location ();
+ DataType type;
+ if (accept (TokenType.UNOWNED) && accept (TokenType.VAR)) {
+ type = new VarType (false);
+ } else {
+ rollback (var_or_type);
+ if (accept (TokenType.VAR)) {
+ type = new VarType ();
+ } else {
+ type = parse_type (true, true);
+ if (accept (TokenType.IN)) {
+ Report.error (type.source_reference, "syntax error, expected `unowned var', `var' or type");
+ throw new ParseError.SYNTAX ("expected `unowned var', `var' or type");
+ }
}
}
string id = parse_identifier ();