|
|
|
@ -267,9 +267,8 @@ class InterpreterBase: |
|
|
|
|
|
|
|
|
|
def validate_comparison_types(self, val1, val2): |
|
|
|
|
if type(val1) != type(val2): |
|
|
|
|
mlog.warning('''Trying to compare values of different types ({}, {}). |
|
|
|
|
The result of this is undefined and will become a hard error |
|
|
|
|
in a future Meson release.'''.format(type(val1).__name__, type(val2).__name__)) |
|
|
|
|
return False |
|
|
|
|
return True |
|
|
|
|
|
|
|
|
|
def evaluate_comparison(self, node): |
|
|
|
|
val1 = self.evaluate_statement(node.left) |
|
|
|
@ -278,11 +277,23 @@ in a future Meson release.'''.format(type(val1).__name__, type(val2).__name__)) |
|
|
|
|
val2 = self.evaluate_statement(node.right) |
|
|
|
|
if is_disabler(val2): |
|
|
|
|
return val2 |
|
|
|
|
self.validate_comparison_types(val1, val2) |
|
|
|
|
valid = self.validate_comparison_types(val1, val2) |
|
|
|
|
# Ordering comparisons of different types isn't allowed since PR #1810 |
|
|
|
|
# (0.41.0). Since PR #2884 we also warn about equality comparisons of |
|
|
|
|
# different types, which will one day become an error. |
|
|
|
|
if not valid and (node.ctype == '==' or node.ctype == '!='): |
|
|
|
|
mlog.warning('''Trying to compare values of different types ({}, {}) using {}. |
|
|
|
|
The result of this is undefined and will become a hard error in a future Meson release.''' |
|
|
|
|
.format(type(val1).__name__, type(val2).__name__, node.ctype), location=node) |
|
|
|
|
if node.ctype == '==': |
|
|
|
|
return val1 == val2 |
|
|
|
|
elif node.ctype == '!=': |
|
|
|
|
return val1 != val2 |
|
|
|
|
elif not valid: |
|
|
|
|
raise InterpreterException( |
|
|
|
|
'Values of different types ({}, {}) cannot be compared using {}.'.format(type(val1).__name__, |
|
|
|
|
type(val2).__name__, |
|
|
|
|
node.ctype)) |
|
|
|
|
elif not self.is_elementary_type(val1): |
|
|
|
|
raise InterpreterException('{} can only be compared for equality.'.format(node.left.value)) |
|
|
|
|
elif not self.is_elementary_type(val2): |
|
|
|
|