#
# Ensure that rules have Normalize or Explore tag.
#
optgen compile test.opt
define True {}

[Name]
(True) => (True)
----
test.opt:3:1: Name rule is missing "Normalize" or "Explore" tag

#
# Ensure that there is only one private field in define, and it is after the
# child expressions and before unexported fields.
#
optgen compile test.opt
define Op {
    Private Type
    Other   RelExpr
}

define Op2 {
    Private  Type
    Private2 Type
}
----
test.opt:3:5: expression field 'Other' cannot follow private or unexported fields in 'Op'
test.opt:8:5: private field 'Private2' cannot follow private or unexported field in 'Op2'

optgen compile test.opt
define Op {
    unexported Type
    Private    Type
}

define Op2 {
    unexported1 Type
    _           Type
    unexported2 Type
}
----
test.opt:3:5: private field 'Private' cannot follow private or unexported field in 'Op'
test.opt:8:5: private field '_' cannot follow private or unexported field in 'Op2'

#
# Ensure that unexported fields are at the end.
#
optgen compile test.opt

define Op {
    undexported Type
    Other       RelExpr
}

define Op2 {
    Other       RelExpr
    unexported  Type
    Private     Type
}
----
test.opt:3:5: expression field 'Other' cannot follow private or unexported fields in 'Op'
test.opt:9:5: private field 'Private' cannot follow private or unexported field in 'Op2'

#
# Ensure that list match type exists.
#
optgen compile test.opt
[Scalar]
define And {
    Left  ScalarExpr
    Right ScalarExpr
}

[InvalidRule, Normalize]
(And $left:* []) => $left
----
test.opt:8:14: list match operator cannot match field of type ScalarExpr
