Commit Graph

29571 Commits

Author SHA1 Message Date
Slava Pestov
a10c5ed8a6 GSB: Remove checkSuperclassConstraints() and checkLayoutConstraints() 2021-05-07 18:43:52 -04:00
Slava Pestov
a49b93c61a GSB: New redundant requirements algorithm
This rewrites the existing redundant requirements algorithm
to be simpler, and fix an incorrect behavior in the case where
we're building a protocol requirement signature.

Consider the following example:

    protocol P {
      associatedtype A : P
      associatedtype B : P where A.B == B
    }

The requirement B : P has two conformance paths here:

    (B : P)
    (A : P)(B : P)

The naive redundancy algorithm would conclude that (B : P) is
redundant because it can be derived as (A : P)(B : P). However,
if we drop (B : P), we lose the derived conformance path
as well, since it involves the same requirement (B : P).

The above example actually worked before this change, because we
handled this case in getMinimalConformanceSource() by dropping any
derived conformance paths that involve the requirement itself
appearing in the "middle" of the path.

However, this is insufficient because you can have a "cycle"
here with length more than 1. For example,

    protocol P {
      associatedtype A : P where A == B.C
      associatedtype B : P where B == A.C
      associatedtype C : P where C == A.B
    }

The requirement A : P has two conformance paths here:

   (A : P)
   (B : P)(C : P)

Similarly, B : P has these two paths:

   (B : P)
   (A : P)(C : P)

And C : P has these two paths:

   (C : P)
   (A : P)(B : P)

Since each one of A : P, B : P and C : P has a derived conformance
path that does not involve itself, we would conclude that all three
were redundant. But this was wrong; while (B : P)(C : P) is a valid
derived path for A : P that allows us to drop A : P, once we commit to
dropping A : P, we can no longer use the other derived paths
(A : P)(C : P) for B : P, and (A : P)(B : P) for C : P, respectively,
because they involve A : P, which we dropped.

The problem is that we were losing information here. The explicit
requirement A : P can be derived as (B : P)(C : P), but we would
just say that it was implied by B : P alone.

For non-protocol generic signatures, just looking at the root is
still sufficient.

However, when building a requirement signature of a self-recursive
protocol, instead of looking at the root explicit requirement only,
we need to look at _all_ intermediate steps in the path that involve
the same protocol.

This is implemented in a new getBaseRequirements() method, which
generalizes the operation of getting the explicit requirement at
the root of a derived conformance path by returning a vector of
one or more explicit requirements that appear in the path.

Also the new algorithm computes redundancy online instead of building
a directed graph and then computing SCCs. This is possible by
recording newly-discovered redundant requirements immediately,
and then using the set of so-far-redundant requirements when
evaluating a path.

This commit introduces a small regression in an existing test case
involving a protocol with a 'derived via concrete' requirement.
Subsequent commits in this PR fix the regression and remove the
'derived via concrete' mechanism, since it is no longer necessary.

Fixes https://bugs.swift.org/browse/SR-14510 / rdar://problem/76883924.
2021-05-07 18:43:52 -04:00
Slava Pestov
ac3cbe5858 GSB: Add a counter and clean up getConformanceAccessPath() a bit 2021-05-07 18:43:52 -04:00
Slava Pestov
0bc6cfe84b Merge pull request #37296 from slavapestov/cleaner-conformance-access-path
GSB: Rewrite getConformanceAccessPath(), again
2021-05-07 12:16:02 -04:00
fwcd
8c0e0e2ef7 Add DiagnosticEngine::diagnosticIDStringFor 2021-05-07 17:45:21 +02:00
Doug Gregor
49edef8dd4 Merge pull request #37304 from DougGregor/revert-nonisolated
[Concurrency] Revert 'nonisolated let' change.
2021-05-07 07:49:03 -07:00
Doug Gregor
40c7341603 Merge pull request #37306 from DougGregor/async-let-family
Reinstate "async let", with "spawn let" as an alias.
2021-05-07 07:48:35 -07:00
Doug Gregor
220e29d674 Reinstate "async let", with "spawn let" as an alias. 2021-05-07 00:13:56 -07:00
Doug Gregor
06dc77ddf3 Revert "[Concurrency] Resyntax 'async let' as 'spawn let'."
This reverts commit 41f42fabbf.
2021-05-06 22:18:36 -07:00
Daniel Rodríguez Troitiño
a1748cb49a [vs2017] Adapt some variadic template aliases to not trip MSVC 2017. (#37284)
It seems that MSVC 2017 trips parsing an using of a using of a variadic
template. Removing one level of using seems to work fine. A preprocessor
macro allows to keep using the same syntax in both MSVC 2017 and other
compilers without making a lot of a mess.

I think this might have been uncovered by landing apple/llvm-project#2898
when it was picked up by the auto-merger for the swift/main branch.
I think this was not a problem until now, because Metadata.h was
compiled using the just compiled Clang until now. LLDB is compiled using
MSVC in Windows.
2021-05-06 19:23:57 -07:00
Rintaro Ishizaki
b348bf60e1 [CodeCompletion] Complete pattern introducer for 'for'
After 'for', suggest 'try', 'await', 'var' and 'case'.

rdar://76355581
2021-05-06 18:13:43 -07:00
Rintaro Ishizaki
df89d28e10 Merge pull request #37280 from rintaro/ide-completon-se0293-rdar76355405
[CodeCompletion] Update for SE-0293 Property Wrappers for func params
2021-05-06 18:10:14 -07:00
Doug Gregor
052cc7d022 [Concurrency] Revert 'nonisolated let' change.
The change made to SE-0306 to require 'nonisolated let' is undercutting
the effectiveness of the model. Revert while we work on a better
solution.
2021-05-06 17:30:11 -07:00
Slava Pestov
e6ff771d59 GSB: Rewrite getConformanceAccessPath(), again
The new approach is to not look at RequirementSources at all. Instead,
we exhaustively enumerate all conformance access paths, beginning
from the root conformance requirements in the signature, then doing
all conformance requirements from those protocols' requirement
signatures, and so on.

We enumerate conformance access paths in breadth first order by
length until we find the one we want. The results are memoized.

This fixes a regression with another change I'm working on. The
test case does not fail with this PR alone, but I'm adding it now
anyway.
2021-05-06 17:55:43 -04:00
Rintaro Ishizaki
a01a3ad530 [CodeCompletion] Update for SE-0293 Property Wrappers for func params
rdar://76355405
2021-05-06 13:21:27 -07:00
Pavel Yaskevich
187a43fea3 Merge pull request #37178 from xedin/rdar-75514153
[Diagnostics] Handle ambiguities related to use of `nil` literal
2021-05-06 11:52:56 -07:00
Argyrios Kyrtzidis
c417464359 Merge pull request #37252 from ahoppen/pr/missing-module-map
[ClangImporter] Load the stdlib even if there is a `-fmodule-map-file` argument pointing to a missing file
2021-05-06 09:02:22 -07:00
Alex Hoppen
aef9d5147f [ClangImporter] Load the stdlib even if there is a -fmodule-map-file argument pointing to a missing file
If there is a `-fmodule-map-file` argument whose file doesn’t exist and SwiftShims is not in the module cache, we fail to build it, because clang throws an error about the missing module map. This causes SourceKit to drop all semantic functionality, even if the missing module map isn’t required.

To work around this, drop all `-fmodule-map-file` arguments with missing files from the clang importer’s arguments, reporting the eror that `clang` would throw manually.

Fixes rdar://77449671
2021-05-06 10:23:58 +02:00
Owen Voorhees
9c02fd1d58 Merge pull request #37236 from owenv/serialize-digester-diag-flag
[APIDigester] Provide a category when serializing diagnostics representing API/ABI breakage
2021-05-05 20:12:09 -07:00
swift-ci
8d7eede32c Merge pull request #37267 from kaar3k/main 2021-05-05 11:09:58 -07:00
Pavel Yaskevich
af3dcf0b12 [Diagnostics] Add a tailored note for passing nil to incompatible argument position
New note mentions both expected argument type and its position
and anchors to the affected overload choice.
2021-05-05 11:00:57 -07:00
Pavel Yaskevich
2f44f5bcd6 [ConstraintSystem] Extract logic that identifies application based on its argument node 2021-05-05 11:00:57 -07:00
Pavel Yaskevich
f5e672e985 Merge pull request #37216 from xedin/rdar-70610141
[Diagnostics] Improve diagnostics when passing `async` to a sync parameter
2021-05-05 10:10:05 -07:00
kaar3k@gmail.com
69a812333c [SR-14135]Updating diagnostic message for convenience init in struct 2021-05-05 19:57:53 +05:30
Saleem Abdulrasool
0771f1ec86 Merge pull request #37211 from compnerd/windows-static-linking
IRGen: support static linking on Windows
2021-05-05 07:26:36 -07:00
Alex Hoppen
d974373f05 Merge pull request #37240 from ahoppen/pr/syntax-parsing-context-debug-utils
[libSyntax] Add a `dumpStack` method to `SyntaxParsingContext`
2021-05-05 15:26:10 +02:00
Xi Ge
c446253075 Use underscored syntax for versioned canImport condition 2021-05-04 19:59:57 -07:00
Owen Voorhees
07fb294c8a [APIDigester] Provide a category when serializing diagnostics representing API or ABI breakage 2021-05-04 19:35:35 -07:00
Pavel Yaskevich
c842773450 [Diagnostics] Re-phrase note about inferred async effect from an operation in a closure body 2021-05-04 10:09:03 -07:00
Michael Gottesman
617a0279fc Merge pull request #37208 from gottesmm/canonicalize-ossa-lifetimes-sil-combine
[sil-combine] Use canonicalizeOSSALifetimes to eliminate unnecessary copies inserted due to RAUWing
2021-05-04 09:52:31 -07:00
Alex Hoppen
2abea17187 [libSyntax] Add a dumpStack method to SyntaxParsingContext
This function walks the stack of `SyntaxParsingContext`s and dumps their kind. Useful for debugging.
2021-05-04 14:53:10 +02:00
Ben Barham
f9859a545f Merge pull request #37196 from bnbarham/warn-on-invalid-sourceinfo
[Serialization] Add warning when .swiftsourceinfo is malformed
2021-05-04 16:16:49 +10:00
Owen Voorhees
9fa2d3195b Merge pull request #37206 from owenv/api-digester-opts 2021-05-03 20:16:46 -07:00
Xi Ge
c40a083164 Merge pull request #37219 from nkcsgexi/73992299-4
ModuleLoader: teach canImport to check Swift user module versions
2021-05-03 18:01:56 -07:00
swift-ci
bbf2ba7118 Merge pull request #37224 from tbkka/tbkka/radar61159451 2021-05-03 17:59:16 -07:00
swift-ci
424c86ee40 Merge pull request #37225 from kavon/enable-eff-props 2021-05-03 17:23:57 -07:00
Ben Barham
415452e259 Merge pull request #37145 from bnbarham/add-external-locs
Add locations from external modules to cursor info results
2021-05-04 09:49:23 +10:00
Kavon Farvardin
e17e09c294 Enable effectful properties (SE-310) by default.
1. Removes gating on -enable-experimental-concurrency.
2. Updates eff. prop tests to remove experimental flag,
   and also adjusts some tests slightly to avoid things
   that are still behind that flag.
2021-05-03 14:10:44 -07:00
Xi Ge
8fa2e8a03d ModuleLoader: teach canImport to check Swift user module versions
For config condition `canImport(Foo, version: N)`, this patch teaches the compiler to check N
against the version of the Swift module Foo on disk. It returns true if the module version on
disk is greater or equal to N and returns false otherwise.

Part of rdar://73992299
2021-05-03 14:04:01 -07:00
Tim Kientzle
142b4f4230 Don't crash if malloc fails
Resolves rdar://61159451
2021-05-03 14:00:19 -07:00
Pavel Yaskevich
21c161d7ae Merge pull request #37209 from LucianoPAlmeida/nfc-record-hole
[NFC][Sema] Changing API to facilitate recording pontential holes recursively
2021-05-03 12:59:41 -07:00
Pavel Yaskevich
886a8ab6b7 [Diagnostics] Improve diagnostics when passing async to a sync parameter
If `async` effect has been inferred from the body of the closure,
let's find out the first occurrence of `async` node and point it out
to make it clear why closure is `async`.

Resolves: rdar://70610141
2021-05-03 11:08:36 -07:00
Pavel Yaskevich
53992d04b6 [ConstraintSystem] NFC: Extract async node identification into a function
It's useful not only for effect determination but for diagnostics as well.
2021-05-03 11:06:59 -07:00
adrian-prantl
c472ce492c Merge pull request #37123 from adrian-prantl/75905336
Expose the LowerHopToActorPass as API so LLDB can schedule it
2021-05-03 10:51:39 -07:00
Kavon Farvardin
1bdf006b1f Merge pull request #37190 from kavon/eff-prop-swiftinterface-ifguard-fix
fix feature guards in swiftinterface for eff. props
2021-05-03 08:52:21 -07:00
Xi Ge
3d6662f382 ModuleInterface: refactor out a utility to extract compiler flags from a module interface file. NFC 2021-05-02 22:46:32 -07:00
Xi Ge
bbe5b83de9 Parser: teach canImport to take an additional parameter indicating the minimum module version
canImport should be able to take an additional parameter labeled by either version or
underlyingVersion. We need underlyingVersion for clang modules with Swift overlays because they
have separate version numbers. The library users are usually interested in checking the importability
of the underlying clang module instead of its Swift overlay.

Part of rdar://73992299
2021-05-02 17:47:44 -07:00
Erik Eckstein
762e9c7882 Serialization: serialize if the module is a static library
If the `-static` option is specified, store that in the generated
swiftmodule file.  When de-serializing, recover this information in the
representative SILModule.

This will be used for code generation on Windows.  It is the missing
piece to allow static linking to function properly.  It additionally
opens the path to additional optimization on ELF-ish targets - GOT, PLT
references can be avoided when the linked module is known to be static.

Co-authored by: Saleem Abdulrasool <compnerd@compnerd.org>
2021-05-02 09:34:52 -07:00
Michael Gottesman
148525e322 Merge pull request #37183 from gottesmm/pr-7ec13868d15cea60ec4eafdbdb099efffff74f9a
[sil-optimizer] Add LLVM_ATTRIBUTE_UNUSED to InstModCallback::on* methods
2021-05-01 19:35:49 -07:00
Luciano Almeida
c069e86f83 [NFC][Sema] Changing API to facilitate recording pontential holes recursively 2021-05-01 23:06:25 -03:00