aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2021-10-22 18:39:54 +0200
committerEli Schwartz <eschwartz93@gmail.com>2021-10-24 09:58:20 -0400
commit2d8da3cb1167c47bb4425e5c58bb6c0c34f52e10 (patch)
treec2c113e3f1b58ba64a82c06238b208796c08ddde
parentffc8721465f87dae25cbabd2ee95b3cc234beff6 (diff)
downloadmeson-2d8da3cb1167c47bb4425e5c58bb6c0c34f52e10.zip
meson-2d8da3cb1167c47bb4425e5c58bb6c0c34f52e10.tar.gz
meson-2d8da3cb1167c47bb4425e5c58bb6c0c34f52e10.tar.bz2
interpreter: Fix missing featuer check (fixes #9425)
-rw-r--r--mesonbuild/interpreter/primitives/array.py4
-rw-r--r--mesonbuild/interpreterbase/interpreterbase.py6
-rw-r--r--test cases/warning/6 list add/meson.build7
-rw-r--r--test cases/warning/6 list add/test.json7
4 files changed, 24 insertions, 0 deletions
diff --git a/mesonbuild/interpreter/primitives/array.py b/mesonbuild/interpreter/primitives/array.py
index 566dff9..f2f458d 100644
--- a/mesonbuild/interpreter/primitives/array.py
+++ b/mesonbuild/interpreter/primitives/array.py
@@ -12,12 +12,14 @@ from ...interpreterbase import (
noPosargs,
noArgsFlattening,
typed_pos_args,
+ FeatureNew,
TYPE_var,
TYPE_kwargs,
InvalidArguments,
)
+from ...mparser import PlusAssignmentNode
if T.TYPE_CHECKING:
# Object holders need the actual interpreter
@@ -92,6 +94,8 @@ class ArrayHolder(ObjectHolder[T.List[TYPE_var]], IterableObject):
@typed_operator(MesonOperator.PLUS, object)
def op_plus(self, other: TYPE_var) -> T.List[TYPE_var]:
if not isinstance(other, list):
+ if not isinstance(self.current_node, PlusAssignmentNode):
+ FeatureNew.single_use('list.<plus>', '0.60.0', self.subproject, 'The right hand operand was not a list.')
other = [other]
return self.held_object + other
diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py
index bc21951..555db3c 100644
--- a/mesonbuild/interpreterbase/interpreterbase.py
+++ b/mesonbuild/interpreterbase/interpreterbase.py
@@ -303,6 +303,7 @@ class InterpreterBase:
if operator in (MesonOperator.IN, MesonOperator.NOT_IN):
val1, val2 = val2, val1
+ val1.current_node = node
return self._holderify(val1.operator_call(operator, _unholder(val2)))
def evaluate_andstatement(self, cur: mparser.AndNode) -> InterpreterObject:
@@ -333,6 +334,7 @@ class InterpreterBase:
v = self.evaluate_statement(cur.value)
if isinstance(v, Disabler):
return v
+ v.current_node = cur
return self._holderify(v.operator_call(MesonOperator.UMINUS, None))
def evaluate_arithmeticstatement(self, cur: mparser.ArithmeticNode) -> InterpreterObject:
@@ -350,6 +352,7 @@ class InterpreterBase:
'div': MesonOperator.DIV,
'mod': MesonOperator.MOD,
}
+ l.current_node = cur
res = l.operator_call(mapping[cur.operation], _unholder(r))
return self._holderify(res)
@@ -358,6 +361,7 @@ class InterpreterBase:
result = self.evaluate_statement(node.condition)
if isinstance(result, Disabler):
return result
+ result.current_node = node
result_bool = result.operator_call(MesonOperator.BOOL, None)
if result_bool:
return self.evaluate_statement(node.trueblock)
@@ -420,6 +424,7 @@ class InterpreterBase:
# Remember that all variables are immutable. We must always create a
# full new variable and then assign it.
old_variable = self.get_variable(varname)
+ old_variable.current_node = node
new_value = self._holderify(old_variable.operator_call(MesonOperator.PLUS, _unholder(addition)))
self.set_variable(varname, new_value)
@@ -432,6 +437,7 @@ class InterpreterBase:
if iobject is None:
raise InterpreterException('Tried to evaluate indexing on None')
+ iobject.current_node = node
return self._holderify(iobject.operator_call(MesonOperator.INDEX, index))
def function_call(self, node: mparser.FunctionNode) -> T.Optional[InterpreterObject]:
diff --git a/test cases/warning/6 list add/meson.build b/test cases/warning/6 list add/meson.build
new file mode 100644
index 0000000..94b7eab
--- /dev/null
+++ b/test cases/warning/6 list add/meson.build
@@ -0,0 +1,7 @@
+project('test list add', meson_version: '>=0.59.0')
+
+l1 = [1, 2, 3]
+l2 = l1 + 4
+l2 += 5
+
+message(l2)
diff --git a/test cases/warning/6 list add/test.json b/test cases/warning/6 list add/test.json
new file mode 100644
index 0000000..35c4567
--- /dev/null
+++ b/test cases/warning/6 list add/test.json
@@ -0,0 +1,7 @@
+{
+ "stdout": [
+ {
+ "line": "WARNING: Project targeting '>=0.59.0' but tried to use feature introduced in '0.60.0': list.<plus>. The right hand operand was not a list."
+ }
+ ]
+}