aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Sales de Andrade <quantum.analyst@gmail.com>2017-05-17 21:39:14 -0400
committerElliott Sales de Andrade <quantum.analyst@gmail.com>2017-05-17 21:48:04 -0400
commitb36513a5b68fa4e34fbbf827a8704e0dc9d25f54 (patch)
tree4bbb11cc45381bb9d6f8c8d5686520a685a2495b
parent30645ed54b4e08611ae4883137d774a4c02b0278 (diff)
downloadmeson-b36513a5b68fa4e34fbbf827a8704e0dc9d25f54.zip
meson-b36513a5b68fa4e34fbbf827a8704e0dc9d25f54.tar.gz
meson-b36513a5b68fa4e34fbbf827a8704e0dc9d25f54.tar.bz2
Only allow equality comparisons for non-elementary types.
-rw-r--r--mesonbuild/interpreterbase.py4
-rw-r--r--test cases/common/19 comparison/meson.build95
-rw-r--r--test cases/failing/51 executable comparison/meson.build6
-rw-r--r--test cases/failing/51 executable comparison/prog.c1
4 files changed, 106 insertions, 0 deletions
diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py
index 2fe21d9..8b951b3 100644
--- a/mesonbuild/interpreterbase.py
+++ b/mesonbuild/interpreterbase.py
@@ -221,6 +221,10 @@ class InterpreterBase:
return val1 == val2
elif node.ctype == '!=':
return val1 != val2
+ 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):
+ raise InterpreterException('{} can only be compared for equality.'.format(node.right.value))
elif node.ctype == '<':
return val1 < val2
elif node.ctype == '<=':
diff --git a/test cases/common/19 comparison/meson.build b/test cases/common/19 comparison/meson.build
index 290c7b4..c4cff9f 100644
--- a/test cases/common/19 comparison/meson.build
+++ b/test cases/common/19 comparison/meson.build
@@ -1,5 +1,7 @@
project('comparison', 'c')
+# Compare equality of strings
+
var1 = 'foo'
var2 = 'bar'
@@ -31,3 +33,96 @@ test('equalfalse', exe1)
test('equaltrue', exe2)
test('nequaltrue', exe3)
test('nequalfalse', exe4)
+
+# Non-equality comparisons
+
+var3 = 3
+var4 = 4
+
+if var3 < var4
+ exe5 = executable('prog5', 'prog.c')
+else
+ exe5 = executable('broken', 'broken.c')
+endif
+
+if var3 < var3
+ exe6 = executable('broken', 'broken.c')
+else
+ exe6 = executable('prog6', 'prog.c')
+endif
+
+if var4 > var3
+ exe7 = executable('prog7', 'prog.c')
+else
+ exe7 = executable('broken', 'broken.c')
+endif
+
+if var3 > var3
+ exe8 = executable('broken', 'broken.c')
+else
+ exe8 = executable('prog8', 'prog.c')
+endif
+
+if var4 <= var3
+ exe9 = executable('broken', 'broken.c')
+else
+ exe9 = executable('prog9', 'prog.c')
+endif
+
+if var3 <= var3
+ exe10 = executable('prog10', 'prog.c')
+else
+ exe10 = executable('broken', 'broken.c')
+endif
+
+if var3 >= var4
+ exe11 = executable('broken', 'broken.c')
+else
+ exe11 = executable('prog11', 'prog.c')
+endif
+
+if var3 >= var3
+ exe12 = executable('prog12', 'prog.c')
+else
+ exe12 = executable('broken', 'broken.c')
+endif
+
+test('lttrue', exe5)
+test('ltfalse', exe6)
+test('gttrue', exe7)
+test('gtfalse', exe8)
+test('lefalse', exe9)
+test('letrue', exe10)
+test('gefalse', exe11)
+test('getrue', exe12)
+
+# Non-elementary type comparisons
+
+if exe1 == exe2
+ exe13 = executable('broken', 'broken.c')
+else
+ exe13 = executable('prog13', 'prog.c')
+endif
+
+if exe1 == exe1
+ exe14 = executable('prog14', 'prog.c')
+else
+ exe14 = executable('broken', 'broken.c')
+endif
+
+if exe1 != exe2
+ exe15 = executable('prog15', 'prog.c')
+else
+ exe15 = executable('broken', 'broken.c')
+endif
+
+if exe1 != exe1
+ exe16 = executable('broken', 'broken.c')
+else
+ exe16 = executable('prog16', 'prog.c')
+endif
+
+test('equalfalse', exe13)
+test('equaltrue', exe14)
+test('nequaltrue', exe15)
+test('nequalfalse', exe16)
diff --git a/test cases/failing/51 executable comparison/meson.build b/test cases/failing/51 executable comparison/meson.build
new file mode 100644
index 0000000..041bcf3
--- /dev/null
+++ b/test cases/failing/51 executable comparison/meson.build
@@ -0,0 +1,6 @@
+project('executable comparison', 'c')
+
+exe1 = executable('prog1', sources : 'prog.c')
+exe2 = executable('prog2', sources : 'prog.c')
+
+assert(exe1 < exe2, 'should fail')
diff --git a/test cases/failing/51 executable comparison/prog.c b/test cases/failing/51 executable comparison/prog.c
new file mode 100644
index 0000000..0314ff1
--- /dev/null
+++ b/test cases/failing/51 executable comparison/prog.c
@@ -0,0 +1 @@
+int main(int argc, char **argv) { return 0; }