Skip to content

Commit d479b2e

Browse files
committed
[ELF] Fix precedence of == and != in expressions
In GNU ld, the == and != operators have lower precedence than < > <= >=. This behavior matches C.
1 parent 3d37e78 commit d479b2e

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

lld/ELF/ScriptParser.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -636,14 +636,15 @@ void ScriptParser::readTarget() {
636636

637637
static int precedence(StringRef op) {
638638
return StringSwitch<int>(op)
639-
.Cases("*", "/", "%", 8)
640-
.Cases("+", "-", 7)
641-
.Cases("<<", ">>", 6)
642-
.Cases("<", "<=", ">", ">=", "==", "!=", 5)
643-
.Case("&", 4)
644-
.Case("|", 3)
645-
.Case("&&", 2)
646-
.Case("||", 1)
639+
.Cases("*", "/", "%", 10)
640+
.Cases("+", "-", 9)
641+
.Cases("<<", ">>", 8)
642+
.Cases("<", "<=", ">", ">=", 7)
643+
.Cases("==", "!=", 6)
644+
.Case("&", 5)
645+
.Case("|", 4)
646+
.Case("&&", 3)
647+
.Case("||", 2)
647648
.Default(-1);
648649
}
649650

lld/test/ELF/linkerscript/operators.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ SECTIONS {
2020
greater = 0 > 1 ? 1 : 2;
2121
greatereq = 1 >= 1 ? 1 : 2;
2222
eq = 1 == 1 ? 1 : 2;
23-
neq = 1 != 1 ? 1 : 2;
23+
neq = (1 != 1 <= 1) ? 1 : 2;
2424
plusassign = 1;
2525
plusassign += 2;
2626
unary = -1 + 3;

0 commit comments

Comments
 (0)