Commit Graph

7976 Commits

Author SHA1 Message Date
Joe Groff
d25b6a5c28 Sema/SILGen: Do erasure from pseudogeneric T to Any without requiring runtime metadata.
Naively wrapping a T in an Any would require metadata for T, but we can go to AnyObject first and put the AnyObject in the Any without T's metadata. This fixes a regression in ObjC generic extension methods when they try to pass their generic parameters to id parameters as Any. rdar://problem/27526877
2016-08-11 11:29:58 -07:00
Jordan Rose
38e6b2808e Do even less availability checking under -disable-availability-checking. (#4214)
...and make sure we're in that mode for SIL inputs and for sil-opt and
sil-extract, even when working with AST types and declarations rather
than SIL types.

Without this, we get zillions of deprecation warnings coming out of
the validation tests SIL/parse_stdlib_*.sil, which dump the standard
library and then attempt to re-parse it. This has been causing the
"long" tests to take, well, too long.
2016-08-11 10:19:46 -07:00
Slava Pestov
a485e525c5 Sema: Allow protocol typealiases to be accessed from expression context, as long as they don't depend on 'Self'
Suppose you have this protocol:

protocol P {
  typealias A = Int
  typealias B = Self
}

Clearly, 'P.B' does not make sense, because then the type parameter
would "leak out" of the existential container. However, 'P.A' is totally
fine, it just means 'Int'.

Previously, we would allow 'P.A' in type context, and diagnose on 'P.B'.

However, due to an oversight, neither one was allowed in expression
context, so for example you could not write 'P.A.self', even though
that should just mean 'Int.self'.

Fix this by generalizing performMemberLookup(), and fix up some
diagnostics to be more specific when something is wrong -- we want
to avoid talking about typealiases as 'static members', since that
doesn't really make much sense.

Fixes <https://bugs.swift.org/browse/SR-2314>.
2016-08-10 23:23:24 -07:00
Slava Pestov
a21c748fee Sema: Fix crash on Linux if ObjCBool type is not present 2016-08-10 10:34:24 -07:00
Slava Pestov
0004bc480a IRGen: Differentiate between Swift.Bool and ObjCBool
SIL already does this where necessary, except with foreign throwing
functions; this patch changes Sema and the ClangImporter to give
them an ObjCBool foreign error result type explicitly.

This fixes a problem where calls to functions taking and returning
the C99 _Bool type were miscompiled on Mac OS X x86-64, because
IRGen was conflating the Objective-C BOOL type (which is a signed
char on some platforms) and C99 _Bool (which lowers as the LLVM
i1 type).

Fixes <rdar://problem/26506458> and <rdar://problem/27365520>.
2016-08-10 10:34:24 -07:00
Argyrios Kyrtzidis
80b3f56b40 [AST] Fix the cursor-info tests with these changes:
- Make sure VarDecls have an associated TypeLoc, like ParamDecls do, then use it for printing the VarDecl's type.
This is done by moving ParamDecl's TypeLoc up to the VarDecl.
This is useful for being able to display the parameter names of function types embedded in VarDecls.

- Use the result TypeLoc of functions for printing. This enables printing parameter names of function types embedded in return types.

- Make sure to annotate attributes while they are printed.
2016-08-09 20:52:09 -07:00
Argyrios Kyrtzidis
1e9bae34a3 [AST] Preserve parameter names in TypeReprs of function types.
Also fixup 'test/SourceKit/CodeExpand/code-expand.swift' and use the syntax
for adding parameter names with an underscore for first name.
2016-08-09 18:07:58 -07:00
Argyrios Kyrtzidis
8b1dde645a [IDE] Fix code-completion fallout after changes for SE-0111.
rdar://27642873
2016-08-09 18:07:58 -07:00
Slava Pestov
adee86068e Merge pull request #4126 from slavapestov/sil-dynamic-self-round-tripping
SIL: Round-trip DynamicSelfType properly
2016-08-09 16:04:19 -07:00
Slava Pestov
ad445d0d63 Merge pull request #4143 from slavapestov/name-lookup-cleanup
Sema: Clean up name lookup and fix a couple of bugs
2016-08-09 16:04:03 -07:00
Joe Groff
54bc52eb1b Sema: Assigning vars of generic param type should not use runtime metadata. 2016-08-09 15:42:11 -07:00
Slava Pestov
173658a5d8 SIL: Round-trip DynamicSelfType properly
When DynamicSelfType occurs outside of a class body (for example,
inside of a SIL function), it is not enough to simply utter 'Self',
because then we lose the underlying type.

Instead, print it out as '@dynamic_self Foo', where 'Foo' is the
underlying class type or archetype, and add parser support for
the same.

Fixes <rdar://problem/27735857>.
2016-08-09 14:18:03 -07:00
Robert Widmann
4b41a7fdee Merge pull request #3947 from harlanhaskins/you-know-claremont-street
Add empty parens to var-to-function renames
2016-08-09 13:56:04 -07:00
Rintaro Ishizaki
8b55c3bb67 [Sema][NFC] Use the name of the Decl instead of "None"
* "None" has been renamed to "none"
2016-08-09 18:18:36 +09:00
Slava Pestov
d5c2f44c4e Sema: Clean up name lookup and fix a couple of bugs
Previously, qualified lookup would use a metatype to signal
to the LookupResultBuilder that conformance checks should not
be used to resolve protocol members found with a concrete
type base. This is too subtle for my taste. Add an explicit
flag and clean up some usages, fixing <rdar://problem/16123805>.

Also, clean up the 'CheckProtocolMembers' flag. We now set
when the base type is an archetype, and correctly handle
the concept of an abstract conformance. This finally
fixes <rdar://problem/22776964>.
2016-08-09 00:53:30 -07:00
Doug Gregor
a15c485193 [SE-0091] Require member operators to refer to the enclosing nominal type.
Member operators should be placed within a nominal type (or extension
thereof) that they operate on. Aside from being good style, enforcing
this in the type checker can help with dependency tracking. Addresses
rdar://problem/27536066.
2016-08-08 23:26:35 -04:00
Ted Kremenek
03815af210 Merge pull request #4108 from nkcsgexi/pointer-diagnosis
[FixCode] Add a diagnosis/fixit to help users convert void pointers.
2016-08-08 18:02:17 -07:00
Ted Kremenek
7ac1f8b6f8 Merge pull request #4123 from jrose-apple/fix-ambiguity-for-generic-param-members
Always resolve overrides when doing member lookups.
2016-08-08 17:43:36 -07:00
Ted Kremenek
1d36ed9ed3 Merge pull request #4116 from rudkx/fix-27639935
Make fix for dynamic lookup on Any work for more general expressions.
2016-08-08 17:01:04 -07:00
Xi Ge
e80a807f4c Merge remote-tracking branch 'apple/master' into pointer-diagnosis 2016-08-08 16:00:09 -07:00
Xi Ge
7ae8f65d7f [test] Updating existing test. NFC 2016-08-08 15:08:09 -07:00
Jordan Rose
7f84faa6fa Always resolve overrides when doing member lookups.
Otherwise, we'll treat lookups on generic parameters as ambiguous,
since we don't have a concrete nominal type to use (coincidentally)
as the "base" of each lookup result.

It's possible we can get rid of this condition altogether, but I don't
want to rock the boat for unqualified lookup right now.

rdar://problem/23087787
2016-08-08 14:58:41 -07:00
Ted Kremenek
92f0d9ea30 Merge pull request #4114 from atrick/rawptr-diag
Improve diagnostics on invalid UnsafePointer conversion.
2016-08-08 14:23:49 -07:00
Mark Lacey
4f5b80dd03 Make fix for dynamic lookup on Any work for more general expressions.
Follow-up to 56a5ef00a4.

Thanks to Jordan for noticing and suggesting this!

rdar://problem/27639935
2016-08-08 12:59:56 -07:00
Xi Ge
b3cbac149a Use one parameter in the diagnosis message instead of two. NFC 2016-08-08 12:57:07 -07:00
Andrew Trick
56f68c4cce Improve diagnostics on invalid UnsafePointer conversion.
The only remaning issue is that we should have a warning to rename
Unsafe[Mutable]Pointer<Void> to Unsafe[Mutable]RawPointer.
2016-08-08 12:54:21 -07:00
Xi Ge
fad2e702ee Add comments describing what the newly added function does. 2016-08-08 12:32:26 -07:00
Xi Ge
91184e1212 [FixCode] Add a diagnosis/fixit to help users convert Unsafe[Mutable]Pointer<Void> to Unsafe[Mutable]RawPointer. rdar://27730408 2016-08-08 12:23:25 -07:00
Xi Ge
a0c7f51e10 Addressing Jordan's code review feedbacks. NFC 2016-08-08 11:00:23 -07:00
Xiaodi Wu
f9435b9ce8 [stdlib] Restore MemoryLayout.*(ofValue:) 2016-08-08 10:46:37 -05:00
Mark Lacey
2ef4a24c8e Fix typos in comments. 2016-08-07 23:43:54 -07:00
Mark Lacey
62c814a86f Merge pull request #4078 from rudkx/fix-27639935
Add a fixit for attempting member lookup on Any.
2016-08-07 15:28:57 -07:00
Mark Lacey
56a5ef00a4 Add a fixit for attempting member lookup on Any.
Suggest casting to AnyObject or a more specific type.

rdar://problem/27639935
2016-08-07 12:19:53 -07:00
Robert Widmann
e63ac0f72b Merge pull request #4019 from harlanhaskins/imported-goods
Improve nonexistent decl diagnostic
2016-08-07 10:25:03 -07:00
practicalswift
0661f61578 Use a-vs-an consistently. 2016-08-06 12:41:55 +02:00
Xi Ge
7afe4cc96d [FixCode] Add a fixit to help users migrate to Swift 3 name convention. (#4058)
* [FixCode] Add a fixit to help users migrate to Swift 3 name convention of enum cases. rdar://26887735

When users' referring to a enum case with a wrong name and we can find a correct enum case whose name
differs from the wrong name only in capitalization, we replace the wrong name with the correct one.

* Addressing Argyrios' code review comments. NFC

* [test] Update existing test.

* Grammatical polish suggested by @CodaFi.
2016-08-05 20:59:26 -07:00
Doug Gregor
ba564eec3e Merge pull request #4057 from DougGregor/dictionary-literal-key-fix
[Type checker] Don't merge dictionary key type variables with different kinds
2016-08-05 16:21:27 -07:00
Doug Gregor
4a569f3924 [Type checker] Don't merge dictionary key type variables with different expression kinds.
The constraint generator's optimization to eagerly merge type
variables for different keys in a dictionary literal was too eager,
merging the type variables for (e.g.) a string literal and an integer
literal. This prevented us from properly inferring AnyHashable key
types in dictionary literals. Fixes the rest of rdar://problem/27661580.
2016-08-05 15:56:00 -07:00
Slava Pestov
e354ecfd45 Sema: Rip out some code for diagnosing invalid patterns
The problem here is that we would just emit 'invalid pattern'
instead of digging deeper, which meant that the fix-it for
qualified enum element access wasn't getting inserted for
more complex patterns, such as 'case X(let x)'.

Unfortunately, in the matching_patterns.swift test, we emit
too many diagnostics that are not really useful to figuring
out the problem, and the old 'invalid pattern' made more
sense. I'll work on some CSDiag tweaks to address this --
I think it makes more sense to dig there than just emit a
general 'invalid pattern' diagnostic anyway.

Fixes <rdar://problem/27684266>.
2016-08-05 14:27:17 -07:00
Slava Pestov
22aa032285 Sema: Clean up SE-0036 diagnostic a bit
Suggest a fix-it for unqualified references to all static members
from instance context, not just enum elements.

Also, fix a small problem with the fix-it for replacing protocol
names with 'Self' inside extension bodies -- we didn't handle nested
functions properly.
2016-08-05 14:27:16 -07:00
Slava Pestov
522f4e4572 AST: Replace recently-added IsInOut bit with simpler check, NFC
Thanks to @lattner for the suggestion.
2016-08-05 14:27:16 -07:00
Michael Ilseman
045bc16b6d Merge pull request #4031 from milseman/noescape_by_default
noescape by default: deprecate @noescape and @autoclosure(escaping)
2016-08-05 13:25:00 -07:00
Jordan Rose
8d9535203b Give a proper error when a member type is inaccessible. (#4033)
This doesn't yet cover top-level types or top-level non-type values,
but it's a start.

Part of rdar://problem/27663403.
2016-08-05 12:41:45 -07:00
Michael Ilseman
8c3b582793 [noescape by default] Incorporate Slav's feedback 2016-08-05 11:16:48 -07:00
John McCall
a6e1e87585 Add implicit conversions and casts from T:Hashable <-> AnyHashable.
rdar://27615802
2016-08-04 23:13:27 -07:00
Doug Gregor
22287ddb58 [Type system] Infer 'Any' for array elements and dictionary values and 'AnyHashable' for dictionary keys.
The id-as-Any work regressed cases where Swift code could specify
heterogeneous collection literals, e.g.,

    var states: [String: Any] = [
      "California": [
        "population": 37_000_000,
        "cities": ["Los Angeles", "San Diego", "San Jose"],
      ],
      "Oregon": [
        "population": 4_000_000,
        "cities": ["Portland", "Salem", "Eugene"],
      ]
    ]

Prior to this, the code worked (when Foundation was imported) because
we'd end up with literals of type [NSObject : AnyObject].

The new defaulting rule says that the element type of an array literal
and the key/value types of a dictionary literal can be defaulted if no
stronger type can be inferred. The default type is:

  Any, for the element type of an array literal or the value type of a
  dictionary literal, or

  AnyHashable, for the key type of a dictionary literal.

The latter is intended to compose with implicit conversions to
AnyHashable, so the most-general inferred dictionary type is
[AnyHashable : Any] and will work for any plausible dictionary
literal.

To prevent this inference from diluting types too greatly, we don't
allow this inference in "top-level" expressions, e.g.,

  let d = ["a" : 1, "b" : "two"]

will produce an error because it's a heterogeneous dictionary literal
at the top level. One should annotate this with, e.g.,

  let d = ["a" : 1, "b" : "two"] as [String : Any]

However, we do permit heterogeneous collections in nested positions,
to support cases like the original motivating example.

Fixes rdar://problem/27661580.
2016-08-04 20:58:13 -07:00
Doug Gregor
2bcf555896 [Constraint solver] Introduce a *trivial* 'meet' operation for types.
Stub out a simplistic 'meet' operation for types that currently only
handles finding the meet of two class types. Use it to optimize the
constraint solver ever so slightly: when we see a type variable whose
constraints state that it is a supertype of two different concrete
types, we attempt to compute their meet and, if we find it, only
produce one potential binding that is the meet itself.

Note that this is an extremely poor implementation of this concept
that is meant to address a specific regression being introduced by the
defaulting of collection literal element types. A real implementation
would, at the very least:

* Implement a proper 'meet' that covers all subtyping in the language.
* Distinguish between "I don't know if there is a meet" and "I am
  absolutely certain that there is no meet".
* Collapse the constraints themselves to reduce the number of
  constraints in the system, rather than just the number of type
  variable bindings we attempt.
2016-08-04 20:36:47 -07:00
Rintaro Ishizaki
3db6fd29ad Merge pull request #3998 from rintaro/rename-fixit-tupleshuffle
[Fix-it] Support defaulted and variadic arguments in renamed fix-it
2016-08-05 12:00:40 +09:00
Michael Ilseman
9e9a1b96c9 [noescape by default] Add @autoclosure @escaping syntax
Adds the preferred syntax for escaping autoclosures, which is
@autoclosure @escaping. Deprecates @autoclosure(escaping), and
provides fixits.
2016-08-04 15:27:34 -07:00
Harlan Haskins
5557ec2bbc Improve nonexistent decl diagnostic 2016-08-04 14:28:49 -07:00