Commit Graph

974 Commits

Author SHA1 Message Date
Pavel Yaskevich
6db0001863 [TypeChecker] NFC: Remove -experimental-multi-statement-closures flag
SE-0326 has been enabled by default, so this flag is no longer necessary.
2022-04-20 10:40:27 -07:00
Pavel Yaskevich
de4cfdf95b [TypeChecker] Disallow if #unavailable to produce different opaque result
Only `if #available` conditions should be allowed to produce a different
underlying type for opaque result to support backward deployment.
2022-04-19 15:27:18 -07:00
John McCall
5519749ade [NFC] Collect protocol decls, not type, in ExistentialLayout
Another thing that will be necessary for correctness with
compositions of parameterized protocols.
2022-04-11 22:15:16 -04:00
Pavel Yaskevich
3b523d568e [TypeChecker] Allow opaque to have multiple underlying types based on availability
Allow opaque type declarations to have multiple unique underlying
types if all such types are conditional on availability via
`if #available(...)` and there is only one universally available
substitution. Neither nesting of availability conditions nor other
dynamic conditions are allowed.

For example:

```swift
protocol P {}

@available(iOS 31.337, *)
struct X : P {
}

struct Y : P {
}

func test() -> some P {
  if #available(iOS 31.337, *) {
    // ... some computation ...
    return X()
  }

  return Y()
}
```

Allows `some P` to refer to `X` instead of `Y` on `iOS 31.337`.
2022-03-29 12:44:28 -07:00
Pavel Yaskevich
a5a50a3658 [AST] NFC: Rename underlying type accessors of OpaqueTypeDecl
Adds a `Unique` component to the accessor names to draw the
distinction between unique and conditionally available substitutions.
2022-03-28 16:22:08 -07:00
Pavel Yaskevich
6462b0d175 [MiscDiagnostics] Fix a crash in OpaqueUnderlyingTypeChecker
Since opaque result type can reference generic parameters of context,
it cannot reply purely on "index" of the opaque generic parameter
while diagnosing a problem, it needs to perform a type substitution
using a substitution map of a particular candidate to determine the
underlying type.

Resolves: rdar://90456579
2022-03-25 16:50:53 -07:00
Pavel Yaskevich
e52c3a0548 [MiscDiagnostics] Produce warnings about confusable self iff its explicit
Restrict the warning to diagnose only explicit instances of `self` reference
that do not mention the parent type via dot syntax e.g. `MyStruct.self`.

Resolves: SR-15897
Resolves: SR-15691
Resolves: rdar://90624344
2022-03-22 19:07:30 -07:00
Keith Smiley
f6b2e2e40c Fix invalid warning for enum cases named self (#41520)
https://github.com/apple/swift/pull/37992/ introduced a warning when you
were likely to confuse `self` with `TypeName.self`, this also applied to
enum cases that were named `self`, these cases should not be easily
confused at call sites since their use requires prefixing them with a
`.`. There was also no way to avoid this warning since other syntax such
as `TypeName.self`, which produces the enum type instead, or
`` TypeName.`self` `` which produced the same warning again.

Fixes https://bugs.swift.org/browse/SR-15691
2022-02-23 09:46:07 -08:00
Doug Gregor
791c9c7d13 Implement most of the semantic analysis for named opaque result types.
Address small gaps in several places to make named opaque result types
partially work:

* Augment name lookup to look into the generic parameters when inside the
result type, which is used both to create structure and add requirements
via a `where` clause.
* Resolve opaque generic type parameter references to
OpaqueTypeArchetypeType instances, as we do for the "some" types
* Customize some opaque-type-specific diagnostics and type printing to
refer to the opaque generic parameter names specifically
* Fix some minor issues with the constraint system not finding
already-opened opaque generic type parameters and with the handling of
the opaque result type candidate set.

The major limitation on opaque types, where we cannot add requirements
that aren't strictly protocol or superclass requirements on the
generic parameters, remains. Until then, named opaque result types are
no more expressive than structural opaque result types.
2022-01-04 21:14:04 -08:00
Doug Gregor
f1ca2d7804 Enable SE-0328 "Structural opaque result types" by default.
Remove the error that prevented the use of multiple opaque result types,
which was the remaining blocker for SE-0328's structural opaque result
types. Add some type checking tests for this feature, and customize
the diagnostics so they describe *which* opaque result type failed to
match when indeed there is a failure.
2021-12-27 19:02:42 -08:00
Cal Stephens
367b1120ab Fix last test failure 2021-12-26 20:48:35 -08:00
Doug Gregor
b97ef02d85 Opaque opaque types and compute substitutions in the constraint system
Opaque opaque types and record them within the "opened types" of the
constraint system, then use that information to compute the set of
substitutions needed for the opaque type declaration using the normal
mechanism of the constraint solver. Record these substitutions within
the underlying-to-opaque conversion.

Use the recorded substitutions in the underlying-to-opaque conversion
to set the underlying substitutions for the opaque type declaration
itself, rather than reconstructing the substitutions in an ad hoc manner
that does not account for structural opaque result types.
2021-12-26 20:33:58 -08:00
Cal Stephens
0f336368ea Update comments 2021-12-26 14:32:34 -08:00
Cal Stephens
c03950b52e Use LabeledConditionalStmt instead of just IfStmt / GuardStmt 2021-12-26 14:09:57 -08:00
Cal Stephens
6fe7dc517e Always emit an error for invalid inner closures trying to use implicit self from an outer closure 2021-12-25 17:14:35 -08:00
Cal Stephens
6c682b719e Fix another test failure, from a defer FuncDecl 2021-12-25 13:57:27 -08:00
Cal Stephens
e21b4d7322 Reject normal ValueDecls but allow ConstructorDecl from '@autoclosure @escaping () -> String = String()' 2021-12-25 10:21:29 -08:00
Cal Stephens
a5b3312da5 Fix more cases, write more test 2021-12-24 20:51:57 -08:00
Cal Stephens
854f024ec1 Fix issue where '@autoclosure () -> String = String()' would be rejected as an invalid implicit self 2021-12-24 16:44:35 -08:00
Cal Stephens
72074b30be Fix some test failures 2021-12-24 16:34:24 -08:00
Cal Stephens
5f8e567b79 Fix crash 2021-12-24 08:17:17 -08:00
Cal Stephens
30f07e13dc Fix edge cases 2021-12-23 18:23:59 -08:00
Cal Stephens
2292e38a38 Fix issue where implicit self wasn't rejected before self is unwrapped 2021-12-23 11:01:53 -08:00
Cal Stephens
4eee6f89b9 Unconditionally permit implicit self in weak closures 2021-12-23 11:01:53 -08:00
Holly Borla
8d52f71561 [NFC][Sema] Rename checkUnsupportedProtocolType to checkExistentialTypes. 2021-12-09 23:15:02 -08:00
Holly Borla
7c7b3ba0da Revert "[NFC, Typechecker] Remove UnsupportedProtocolVisitor and checkUnsupportedProtocolType()"
This reverts commit 15f88e9be3.
2021-12-09 23:15:02 -08:00
Pavel Yaskevich
4cd404d020 [MiscDiagnostics] Introduce a base class for diagnostic walkers
Put some common logic related to local declaration to the base
class and refactor other walkers to use it instead of `ASTWalker`.
2021-12-03 10:57:33 -08:00
Pavel Yaskevich
9bd603bfc9 [Diagnostics] Apply "unhandled throw" diagnostic for for-in loop in closures
Extract diagnostic into a method and use it while type-checking
`for-in` in top-level code and in closures.
2021-12-03 10:56:32 -08:00
Saleem Abdulrasool
349af3707d Merge pull request #40305 from compnerd/semitruck
gardening: make c++98-compat-extra-semi an error
2021-11-30 08:18:36 -08:00
Pavel Yaskevich
bc54bc6bb7 Revert "[TypeChecker] SE-0326: Enable multi-statement closure inference by default" 2021-11-29 17:26:08 -08:00
Saleem Abdulrasool
910fbee14e gardening: make c++98-compat-extra-semi an error
This cleans up 90 instances of this warning and reduces the build spew
when building on Linux.  This helps identify actual issues when
building which can get lost in the stream of warning messages.  It also
helps restore the ability to build the compiler with gcc.
2021-11-27 11:40:17 -08:00
Hamish Knight
ede9302704 [Sema] Fix spurious trailing closure warning
With the argument list refactoring, it's no
longer sufficient to stop walking when we encounter
an explicit tuple or paren. Add an additional
check to stop walking when we encounter an explicit
argument list.

rdar://85343171
2021-11-19 19:26:04 +00:00
Pavel Yaskevich
8b901544ee [MiscDiagnostics] Introduce a base class for diagnostic walkers
Put some common logic related to local declaration to the base
class and refactor other walkers to use it instead of `ASTWalker`.
2021-11-15 16:42:05 -08:00
Pavel Yaskevich
7b0f68c05f [Diagnostics] Apply "unhandled throw" diagnostic for for-in loop in closures
Extract diagnostic into a method and use it while type-checking
`for-in` in top-level code and in closures.
2021-11-15 16:42:05 -08:00
Robert Widmann
ded4dd2103 Suggest Replacement Types for Invalid Placeholders
Now that placeholder types are preserved, we can open them wherever they appear in positions where they are used as contextual types. Use the checks we already run in the primaries to ban placeholders in top-level positions. Only now, use the inferred type of any associated expressions or statements to present the user with a contextual return type.

For parameters in functions and enum cases, we use any default argument expressions to get the contextual type.

For functions, we use a traversal similar to the opaque result type finder to find the type of any return statements in the program and present those as options.
2021-11-03 10:29:15 -07:00
Alexis Laferrière
1a3f28500b [Sema] Don't check availability in assigned properties initializers
For a non-public property where the type is defined by an assignment, like
`internal var internalAssigned = NewStruct()`, type-checking the type's
availability is done via checking the initializer expression.

In -check-api-availaiblity-only mode, pass down a flag to not check
availability in expressions for initializer expressions of such
non-public properties.

rdar://84389825
2021-10-25 13:46:53 -07:00
Hamish Knight
dc60996f89 Merge pull request #38836 from hamishknight/toil-and-tuple 2021-09-04 19:30:04 +01:00
Jack March
7e0a7f322a fix SR-4559 (unapplied reference to method named "self" can be used without qualification)
https://bugs.swift.org/browse/SR-4559
2021-09-02 21:17:42 +01:00
John McCall
a00ed9f2dd Merge pull request #39118 from rjmccall/implicit-self-capture-capture-warning
Fix the condition for warning about implicit capture of self captures.
2021-09-02 01:09:21 -04:00
Konrad `ktoso` Malawski
b73050e49e Merge pull request #39095 from AnthonyLatsis/se-309
SE-0309: Unlock existential types for all protocols
2021-09-02 11:27:39 +09:00
Hamish Knight
3e28bbbd2c Update for review feedback
- Remove OriginalArguments in favor of storing the
pre-rewritten argument list, which simplifies things
nicely
- Adopt llvm::indexed_accessor_iterator
2021-09-01 18:40:29 +01:00
Hamish Knight
ad55c0976b [MiscDiagnostics] Adopt ArgumentList 2021-09-01 18:40:25 +01:00
John McCall
1711df4ce4 Fix the condition for warning about implicit capture of self captures.
We've always emitted an error if we saw an implicit use of a self
parameter of class type from an escaping closure.  In PR #35898, I fixed
this to also emit an error if the reference was to an explicit capture
of self that wasn't made in the current closure.  That was causing
some source incompatibilities that we decided were too severe, so in
PR #38947 I weakened that to a warning when the diagnostic walk was
within multiple levels of closures, because I have always thought of
this as a fix to nested closures.  However, this was the wrong condition
in two ways.

First, the diagnostic walk does not always start from the outermost
function declaration; it can also start from a multi-statement closure.
In that case, we'll still end up emitting an error when we see uses
of explicit captures from the closure when we walk it, and so we still
have a source incompatibility.  That is rdar://82545600.

Second, the old diagnostic did actually fire correctly in nested
closures as long as the code was directly referring to the original
self parameter and not any intervening captures.  Therefore, #38947
actually turned some things into warnings that had always been errors.

The fix is to produce a warning exactly when the referenced declaration
was an explicit capture.
2021-09-01 02:29:51 -04:00
Suyash Srijan
15f88e9be3 [NFC, Typechecker] Remove UnsupportedProtocolVisitor and checkUnsupportedProtocolType() 2021-08-31 19:21:26 +03:00
Rintaro Ishizaki
857490e3cb Merge pull request #39078 from rintaro/isa_and_nonnull 2021-08-27 21:46:42 -07:00
Rintaro Ishizaki
49547a5378 [NFC][Basic] Import llvm::isa_and_nonnull to 'swift' namespace
Just for convenicence.

* Replace `llvm::isa_and_nonnull` with imported `isa_and_nonnull`
* Repalce some `EXPR && isa<T>(EXPR)` with `isa_and_nonnull<T>(EXPR)`
2021-08-27 11:36:21 -07:00
Hamish Knight
8be85c09b9 [Sema] Have isValidTypeExprParent consider its child
With the introduction of the ArgumentList type,
argument expressions will be direct decedents of
call expressions, without an intermediate TupleExpr.
As such, we need to tweak isValidTypeExprParent to
consider the child expression such that `T(x)` is
permissible, but `x(T)` is not.

Change isValidTypeExprParent to take a child expr
parameter, and update its use in MiscDiagnostics
and PreCheckExpr. For PreCheckExpr, switch from a
stack to walking the parent directly, as a
stack-based approach would be a bit more fiddly in
this case, and walking the parents shouldn't be
expensive.

This should be NFC, I'm splitting it off from the
ArgumentList refactoring to make the rebasing there
a little more straightforward.
2021-08-27 12:38:33 +01:00
Kavon Farvardin
c0607b345f Revert "Merge pull request #33767 from theblixguy/chore/remove-self-or-associated-type-diagnostic"
The following regression test added for this feature is not passing:

Swift(linux-x86_64) :: decl/protocol/protocols_with_self_or_assoc_reqs_executable.swift

with a compiler crash happening during SILFunctionTransform "Devirtualizer".

Reverting to unblock CI.

This reverts commit f96057e260, reversing
changes made to 3fc18f3603.
2021-08-26 16:46:42 -07:00
Konrad `ktoso` Malawski
f96057e260 Merge pull request #33767 from theblixguy/chore/remove-self-or-associated-type-diagnostic
SE-0309: Unlock existential types for all protocols
2021-08-27 06:09:47 +09:00
Frederick Kellison-Linn
42b04279f0 [Sema] Rework TypeExpr folding for placeholders 2021-08-19 14:53:33 -04:00