| // RUN: %empty-directory(%t) |
| // RUN: %gyb %s -o %t/main.swift |
| // RUN: %line-directive %t/main.swift -- %target-build-swift -typecheck -Xfrontend -verify %t/main.swift |
| // REQUIRES: executable_test |
| // FIXME(integers): this test needs serious refactoring as there is now a lot |
| // more variation in the diagnostics. <rdar://problem/31635173> |
| // XFAIL: * |
| |
| % from SwiftIntTypes import all_numeric_type_names, numeric_type_names_macintosh_only, \ |
| % all_integer_type_names, all_integer_binary_operator_names, all_integer_or_real_binary_operator_names, \ |
| % all_integer_assignment_operator_names, \ |
| % all_integer_or_real_assignment_operator_names |
| |
| % int_ops = all_integer_binary_operator_names() + all_integer_assignment_operator_names() |
| % arith_ops = all_integer_or_real_binary_operator_names() + \ |
| % all_integer_or_real_assignment_operator_names() |
| |
| % count = 0 |
| // TODO: Verify the type of the result |
| |
| func testIteratedOperations() { |
| % for typesToTest, operatorsToTest in zip([all_integer_type_names(), all_numeric_type_names()], |
| % [int_ops, arith_ops]): |
| %# TODO: rm when rdar://18695154 is fixed. |
| // typesToTest: ${typesToTest}, operatorsToTest: ${operatorsToTest} |
| % for T1 in typesToTest: |
| % for T2 in typesToTest: |
| ${ "\n\n#if arch(i386) || arch(x86_64)\n" if T1 in numeric_type_names_macintosh_only() |
| or T2 in numeric_type_names_macintosh_only() else "" } |
| % for op in operatorsToTest: |
| % count += 1 |
| % theDiagnostic = "" |
| % all_assignment_operators = (all_integer_assignment_operator_names() + all_integer_or_real_assignment_operator_names()) |
| % if T1 != T2: |
| % if op in [">>", "<<"]: # heterogeneous shifts are allowed |
| % theDiagnostic = "" |
| % elif op in [">>=", "<<="]: |
| % theDiagnostic = "// expected-note{{add an explicit type annotation}} expected-warning{{inferred to have type}}" |
| % elif op not in ["&+", "&-", "&*"]: |
| % theDiagnostic = "// expected-error{{of type}} expected-note*{{expected an argument list of type}} expected-note*{{exist with these partially matching parameter lists}}" |
| % else: |
| % theDiagnostic = "// expected-error {{'Self' could not be inferred}}" |
| % end |
| % else: |
| % if op in all_assignment_operators: |
| % theDiagnostic = "// expected-note{{add an explicit type annotation}} expected-warning{{inferred to have type}}" |
| % else: |
| % pass |
| % end |
| % end |
| do { // ${count} |
| var x1_${T1}: ${T1} = 0 |
| var x2_${T2}: ${T2} = 0 |
| var result = x1_${T1} ${op} x2_${T2} ${theDiagnostic} |
| } |
| % end # for op |
| ${ "\n#endif //arch(i386) || arch(x86_64)\n\n" if T1 in numeric_type_names_macintosh_only() |
| or T2 in numeric_type_names_macintosh_only() else "" } |
| %end # T2 |
| %end # T1 |
| %end # typesToTest |
| |
| } |