Commit 96857b1b authored by Rico Tzschichholz's avatar Rico Tzschichholz

vala: Report invalid instance member access to property

See GNOME/vala#605
parent 1746709f
......@@ -174,6 +174,13 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
}
}
if (pub_inst == null && prop.binding == MemberBinding.INSTANCE) {
// FIXME Report this with proper source-reference on the vala side!
Report.error (prop.source_reference, "Invalid access to instance member `%s'".printf (prop.get_full_name ()));
set_cvalue (expr, new CCodeInvalidExpression ());
return;
}
if (expr.inner is BaseAccess) {
var base_prop = prop;
if (prop.base_property != null) {
......@@ -312,6 +319,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
ccode.add_expression (ccall);
set_cvalue (expr, ctemp);
}
expr.target_value.value_type = expr.value_type;
expr.target_value = store_temp_value (expr.target_value, expr);
} else if (expr.symbol_reference is LocalVariable) {
......
......@@ -161,6 +161,7 @@ TESTS = \
control-flow/bug736774-1.vala \
control-flow/bug736774-2.vala \
control-flow/bug790903.test \
control-flow/bug790903-2.test \
control-semantic/argument-extra.test \
control-semantic/argument-incompatible-type-out.test \
control-semantic/argument-incompatible-type-ref.test \
......@@ -583,6 +584,7 @@ TESTS = \
semantic/field-namespace-owned.test \
semantic/field-non-constant.test \
semantic/field-owned-to-unowned.test \
semantic/field-static-instance-access.test \
semantic/field-void.test \
semantic/floating-reference.vala \
semantic/foreach-iterator-args.test \
......@@ -604,6 +606,7 @@ TESTS = \
semantic/localvariable-owned-to-unowned.test \
semantic/localvariable-var-static-access-instance-field.test \
semantic/localvariable-var-static-access-instance-method.test \
semantic/localvariable-var-static-access-instance-property.test \
semantic/localvariable-var-without-initializer.test \
semantic/localvariable-void.test \
semantic/method-abstract.test \
......@@ -651,6 +654,7 @@ TESTS = \
semantic/property-override.test \
semantic/property-override-class.test \
semantic/property-override-interface.test \
semantic/property-static-instance-access.test \
semantic/property-struct-abstract.test \
semantic/property-struct-override.test \
semantic/property-struct-protected.test \
......
Invalid Code
class Foo {
public string prop { get; set; }
}
void main () {
var foo = (string) Foo.prop;
}
Invalid Code
class Foo {
string? field;
static void foo () {
if (field == null) {
}
}
}
void main() {
}
Invalid Code
class Foo {
int prop { get; set; }
static void bar () {
var p = prop;
}
}
void main () {
}
Invalid Code
class Foo {
string? prop { get; set; }
static void foo () {
if (prop == null) {
}
}
}
void main() {
}
......@@ -126,6 +126,7 @@ libvala_la_VALASOURCES = \
valaprofile.vala \
valapropertyaccessor.vala \
valaproperty.vala \
valapropertyprototype.vala \
valarealliteral.vala \
valareferencetransferexpression.vala \
valareferencetype.vala \
......
......@@ -306,12 +306,12 @@ public class Vala.BinaryExpression : Expression {
return false;
}
if (left.value_type is FieldPrototype) {
if (left.value_type is FieldPrototype || left.value_type is PropertyPrototype) {
error = true;
Report.error (left.source_reference, "Access to instance member `%s' denied".printf (left.symbol_reference.get_full_name ()));
return false;
}
if (right.value_type is FieldPrototype) {
if (right.value_type is FieldPrototype || right.value_type is PropertyPrototype) {
error = true;
Report.error (right.source_reference, "Access to instance member `%s' denied".printf (right.symbol_reference.get_full_name ()));
return false;
......
......@@ -132,7 +132,7 @@ public class Vala.LocalVariable : Variable {
Report.error (source_reference, "var declaration not allowed with non-typed initializer");
return false;
}
if (initializer.value_type is FieldPrototype) {
if (initializer.value_type is FieldPrototype || initializer.value_type is PropertyPrototype) {
error = true;
Report.error (initializer.source_reference, "Access to instance member `%s' denied".printf (initializer.symbol_reference.get_full_name ()));
return false;
......
......@@ -788,6 +788,8 @@ public class Vala.MemberAccess : Expression {
value_type = context.analyzer.get_value_type_for_symbol (symbol_reference, lvalue);
} else if (symbol_reference is Field) {
value_type = new FieldPrototype ((Field) symbol_reference);
} else if (symbol_reference is Property) {
value_type = new PropertyPrototype ((Property) symbol_reference);
} else {
value_type = new InvalidType ();
}
......
/* valafieldprototype.vala
*
* Copyright (C) 2018 Rico Tzschichholz
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Author:
* Rico Tzschichholz <ricotz@ubuntu.com>
*/
/**
* A reference to an instance property without a specific instance.
*/
public class Vala.PropertyPrototype : DataType {
public weak Property property_symbol { get; set; }
public PropertyPrototype (Property property_symbol) {
this.property_symbol = property_symbol;
}
public override DataType copy () {
var result = new PropertyPrototype (property_symbol);
return result;
}
public override string to_qualified_string (Scope? scope) {
return property_symbol.get_full_name ();
}
}
......@@ -160,7 +160,7 @@ public class Vala.UnaryExpression : Expression {
return false;
}
if (inner.value_type is FieldPrototype) {
if (inner.value_type is FieldPrototype || inner.value_type is PropertyPrototype) {
error = true;
Report.error (inner.source_reference, "Access to instance member `%s' denied".printf (inner.symbol_reference.get_full_name ()));
return false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment