Files
swift-mirror/test/Parse/operator_decl.swift
Mark Lacey 039d10b709 Add support for parsing designated protocols in operator declarations.
The support is gated by a frontend option,
-enable-operator-designated-protocols.

This means that in an operator declaration we can declare a protocol
which has one or more requirements specifying this operator. The
operators from that designated protocol will be the first ones we try
when type checking an expression. If we successfully typecheck using
the operators specified in that protocol, we do not attempt any other
overloads of the same operator.

This makes it possible to dramatically speed up successful
typechecking.
2018-09-05 11:58:43 -07:00

96 lines
3.5 KiB
Swift

// RUN: %target-typecheck-verify-swift
prefix operator +++ {} // expected-error {{operator should no longer be declared with body}} {{20-23=}}
postfix operator +++ {} // expected-error {{operator should no longer be declared with body}} {{21-24=}}
infix operator +++ {} // expected-error {{operator should no longer be declared with body}} {{19-22=}}
infix operator +++* { // expected-error {{operator should no longer be declared with body; use a precedence group instead}} {{none}}
associativity right
}
infix operator +++*+ : A { } // expected-error {{operator should no longer be declared with body}} {{25-29=}}
prefix operator +++** : A { }
// expected-error@-1 {{only infix operators may declare a precedence}} {{23-27=}}
// expected-error@-2 {{operator should no longer be declared with body}} {{26-30=}}
prefix operator ++*++ : A
// expected-error@-1 {{only infix operators may declare a precedence}} {{23-26=}}
postfix operator ++*+* : A { }
// expected-error@-1 {{only infix operators may declare a precedence}} {{24-28=}}
// expected-error@-2 {{operator should no longer be declared with body}} {{27-31=}}
postfix operator ++**+ : A
// expected-error@-1 {{only infix operators may declare a precedence}} {{24-27=}}
operator ++*** : A
// expected-error@-1 {{operator must be declared as 'prefix', 'postfix', or 'infix'}}
operator +*+++ { }
// expected-error@-1 {{operator must be declared as 'prefix', 'postfix', or 'infix'}}
// expected-error@-2 {{operator should no longer be declared with body}} {{15-19=}}
operator +*++* : A { }
// expected-error@-1 {{operator must be declared as 'prefix', 'postfix', or 'infix'}}
// expected-error@-2 {{operator should no longer be declared with body}} {{19-23=}}
prefix operator // expected-error {{expected operator name in operator declaration}}
;
prefix operator %%+
prefix operator ??
postfix operator ?? // expected-error {{expected operator name in operator declaration}}
prefix operator !!
postfix operator !! // expected-error {{expected operator name in operator declaration}}
infix operator +++=
infix operator *** : A
infix operator --- : ;
precedencegroup { // expected-error {{expected identifier after 'precedencegroup'}}
associativity: right
}
precedencegroup A {
associativity right // expected-error {{expected colon after attribute name in precedence group}}
}
precedencegroup B {
precedence 123 // expected-error {{'precedence' is not a valid precedence group attribute}}
}
precedencegroup C {
associativity: sinister // expected-error {{expected 'none', 'left', or 'right' after 'associativity'}}
}
precedencegroup D {
assignment: no // expected-error {{expected 'true' or 'false' after 'assignment'}}
}
precedencegroup E {
higherThan:
} // expected-error {{expected name of related precedence group after 'higherThan'}}
precedencegroup F {
higherThan: A, B, C
}
precedencegroup BangBangBang {
associativity: none
associativity: left // expected-error{{'associativity' attribute for precedence group declared multiple times}}
}
precedencegroup CaretCaretCaret {
assignment: true
assignment: false // expected-error{{'assignment' attribute for precedence group declared multiple times}}
}
class Foo {
infix operator ||| // expected-error{{'operator' may only be declared at file scope}}
}
infix operator **<< : UndeclaredPrecedenceGroup
// expected-error@-1 {{unknown precedence group 'UndeclaredPrecedenceGroup'}}
protocol Proto {}
infix operator *<*< : F, Proto
// expected-error@-1 {{consecutive statements on a line must be separated by ';'}}
// expected-error@-2 {{expected expression}}