# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
# RUN: echo "SECTIONS { \
# RUN:  plus = 1 + 2 + 3; \
# RUN:  minus = 5 - 1; \
# RUN:  div = 6 / 2; \
# RUN:  mul = 1 + 2 * 3; \
# RUN:  nospace = 1+2*6/3; \
# RUN:  braces = 1 + (2 + 3) * 4; \
# RUN:  and = 0xbb & 0xee; \
# RUN:  ternary1 = 1 ? 1 : 2; \
# RUN:  ternary2 = 0 ? 1 : 2; \
# RUN:  less = 1 < 0 ? 1 : 2; \
# RUN:  lesseq = 1 <= 1 ? 1 : 2; \
# RUN:  greater = 0 > 1 ? 1 : 2; \
# RUN:  greatereq = 1 >= 1 ? 1 : 2; \
# RUN:  eq = 1 == 1 ? 1 : 2; \
# RUN:  neq = 1 != 1 ? 1 : 2; \
# RUN:  plusassign = 1; \
# RUN:  plusassign += 2; \
# RUN:  unary = -1 + 3; \
# RUN:  lshift = 1 << 5; \
# RUN:  rshift = 0xff >> 3; \
# RUN:  maxpagesize = CONSTANT (MAXPAGESIZE); \
# RUN:  commonpagesize = CONSTANT (COMMONPAGESIZE); \
# RUN:  . = 0xfff0; \
# RUN:  datasegmentalign = DATA_SEGMENT_ALIGN (0xffff, 0); \
# RUN: }" > %t.script
# RUN: ld.lld %t --script %t.script -o %t2
# RUN: llvm-objdump -t %t2 | FileCheck %s

# CHECK: 00000000000006 *ABS* 00000000 plus
# CHECK: 00000000000004 *ABS* 00000000 minus
# CHECK: 00000000000003 *ABS* 00000000 div
# CHECK: 00000000000007 *ABS* 00000000 mul
# CHECK: 00000000000005 *ABS* 00000000 nospace
# CHECK: 00000000000015 *ABS* 00000000 braces
# CHECK: 000000000000aa *ABS* 00000000 and
# CHECK: 00000000000001 *ABS* 00000000 ternary1
# CHECK: 00000000000002 *ABS* 00000000 ternary2
# CHECK: 00000000000002 *ABS* 00000000 less
# CHECK: 00000000000001 *ABS* 00000000 lesseq
# CHECK: 00000000000002 *ABS* 00000000 greater
# CHECK: 00000000000001 *ABS* 00000000 greatereq
# CHECK: 00000000000001 *ABS* 00000000 eq
# CHECK: 00000000000002 *ABS* 00000000 neq
# CHECK: 00000000000003 *ABS* 00000000 plusassign
# CHECK: 00000000000002 *ABS* 00000000 unary
# CHECK: 00000000000020 *ABS* 00000000 lshift
# CHECK: 0000000000001f *ABS* 00000000 rshift
# CHECK: 00000000001000 *ABS* 00000000 maxpagesize
# CHECK: 00000000001000 *ABS* 00000000 commonpagesize
# CHECK: 0000000000ffff *ABS* 00000000 datasegmentalign

## Mailformed number error.
# RUN: echo "SECTIONS { . = 0x12Q41; }" > %t.script
# RUN: not ld.lld %t --script %t.script -o %t2 2>&1 | \
# RUN:  FileCheck --check-prefix=NUMERR %s
# NUMERR: malformed number: 0x12Q41

## Missing closing bracket.
# RUN: echo "SECTIONS { . = (1; }" > %t.script
# RUN: not ld.lld %t --script %t.script -o %t2 2>&1 | \
# RUN:  FileCheck --check-prefix=BRACKETERR %s
# BRACKETERR: ) expected, but got ;

## Missing opening bracket.
# RUN: echo "SECTIONS { . = 1); }" > %t.script
# RUN: not ld.lld %t --script %t.script -o %t2 2>&1 | \
# RUN:  FileCheck --check-prefix=BRACKETERR2 %s
# BRACKETERR2: ; expected, but got )

## Empty expression.
# RUN: echo "SECTIONS { . = ; }" > %t.script
# RUN: not ld.lld %t --script %t.script -o %t2 2>&1 | \
# RUN:  FileCheck --check-prefix=ERREXPR %s
# ERREXPR: malformed number: ;

## Div by zero error.
# RUN: echo "SECTIONS { . = 1 / 0; }" > %t.script
# RUN: not ld.lld %t --script %t.script -o %t2 2>&1 | \
# RUN:  FileCheck --check-prefix=DIVZERO %s
# DIVZERO: division by zero

## Broken ternary operator expression.
# RUN: echo "SECTIONS { . = 1 ? 2; }" > %t.script
# RUN: not ld.lld %t --script %t.script -o %t2 2>&1 | \
# RUN:  FileCheck --check-prefix=TERNERR %s
# TERNERR: : expected, but got ;

.globl _start
_start:
nop
