Commit Graph

22474 Commits

Author SHA1 Message Date
Ted Kremenek
02c8131049 Add 'elements()' accessor to BraceStmt to provide easy iteration over
a BraceStmt's elements.  The other accessors can probably go away.

Swift SVN r2583
2012-08-07 23:11:47 +00:00
Chris Lattner
5184be484f Finish off rdar://12017658 - func() expression should support type inference of argument types.
This implements inference of return types, per the discussion today.



Swift SVN r2572
2012-08-07 05:12:32 +00:00
Doug Gregor
051a7dff91 Make sure that class/struct/oneof types are canonical once they have
been type-checked. The initialize constructed types are not (and
cannot be) canonical because archetypes aren't assigned until the
generic parameters in the current and outer contexts are
type-checked.

Test forthcoming as part of IRgen support for nested generics.


Swift SVN r2569
2012-08-06 20:24:24 +00:00
Doug Gregor
531583e2d1 Implement support for nested generics in the AST and type
checker. There are a few related sets of changes here:

  - Generic parameter lists have a link  to their "outer" generic
  parameter lists, so its easy to establish the full generic context
  of an entity.
  - Bound and unbound generic types now carry a parent type, so that
  we distinguish between, e.g., X<Int>.Inner<Int> and
  X<Double>.Inner<Int>. Deduction, substitution, canonicalization,
  etc. cope with the parent type.
  - Opening of polymorphic types now handles multiple levels of
  generic parameters when needed (e.g., when we're substituting into
  the base).

Note that the generics module implied by this representation restricts
what one can do with requirements clauses in nested generics. For
example, one cannot add requirements to outer generic parameters or
their associated types, e.g., this is ill-formed:

  struct X<T : Range> {
    func f<U requires T.Element : Range>() {}
  }

The restriction has some precedent (e.g., in C#), but could be
loosened by rearchitecting how we handle archetypes in nested
generics. The current approach is more straightforward.


Swift SVN r2568
2012-08-06 19:02:06 +00:00
Doug Gregor
5b03ddf45c Fix diagnostic when we don't encounter a '(' after parsing 'constructor'.
Swift SVN r2566
2012-08-06 16:16:27 +00:00
Ted Kremenek
219b7bd430 Move LLVM.h to libBasic.
Swift SVN r2550
2012-08-03 23:54:29 +00:00
Chris Lattner
b3f4547a9b use contextual type information to infer the argument types for func exprs
without fully typed patterns.  This is the first half of rdar://12017658,
the second half is to infer return types.



Swift SVN r2528
2012-08-03 05:03:46 +00:00
Chris Lattner
d55662b1db fix a bug where FunctionType wasn't getting set as containing an Unresolved type in some cases.
Fixing this causes a regression in generic argument deduction, presumably because something
deep in the generics overload set pruning logic isn't handling function types with unresolved
components.  For now, I'm disabling the tests that check for this, but I'd obviously appreciate
it if someone could take a look.



Swift SVN r2527
2012-08-03 05:01:38 +00:00
Eli Friedman
0bfcfbfb8a Change the type of ConstructorDecls to be of the form metatype<T> -> () -> (). Change a bunch of stuff to compensate. Get rid of ConstructorRefExpr, which is no longer used.
Swift SVN r2526
2012-08-03 03:58:44 +00:00
Chris Lattner
91c98c5c7d comment update.
Swift SVN r2520
2012-08-03 01:11:26 +00:00
Eli Friedman
3d0d23b3ce Stop use OneOfElementDecls to represent constructors in structs.
Swift SVN r2518
2012-08-03 00:53:36 +00:00
Doug Gregor
532737205b Improve checking of protocol-conformance requirements for generic
types in a few ways:
  - Actually check the extra requirements placed on associated types,
  e.g., "T.Element : Ordered"
  - Actually encode/store the protocol conformance information for a
  BoundGenericType in the same way that we do for SpecializeExpr,
  GenericMemberRefExpr, and GenericSubscriptExpr. Yay, consistency.
  - Move the storage for the protocol conformance information into a
  DenseMap in the ASTContext indexed by canonical BoundGenericType, so
  it doesn't require inline storage in BoundGenericType.


Swift SVN r2517
2012-08-03 00:41:32 +00:00
Chris Lattner
c0b0fb5817 doh, case insensitive filesytem. You'd think that Clang would have a warning for this :)
Swift SVN r2514
2012-08-03 00:33:43 +00:00
Chris Lattner
6dbf5b9e01 include the proper path to the header instead of a relative path.
Swift SVN r2511
2012-08-03 00:28:01 +00:00
Doug Gregor
3eed1fbafd Generalize the substitution of a "base type" into a reference to a
member of a oneof/struct/class/extension to support types nested
within generic classes, e.g., Vector<Int>.ElementRange. 

Most importantly, nominal types are no longer inherently canonical. A
nominal type refers to both a particular nominal type declaration as
well as its parent, which may be non-canonical and will vary. For
example, the variance in the parent makes Vector<Int>.ElementRange and
Vector<Float>.ElementRange different types. 

Introduce deduction and substitution for nominal types. Deduction is
particular interesting because we actually do allow deduction of T
when comparing X<T>.Inner and X<Int>.Inner, because (unlike C++) there
is no specialization to thwart us.



Swift SVN r2507
2012-08-02 21:22:44 +00:00
Ted Kremenek
0e5ff44b27 Add boilerplate for the *start* of Swift CFGs. Nothing to look at yet. Major WIP.
Swift SVN r2506
2012-08-02 21:21:03 +00:00
Chris Lattner
b6f6eec106 implement rdar://11935352 - accepting closures with no body expression (the closure
just returns "()").


Swift SVN r2503
2012-08-02 20:08:51 +00:00
Doug Gregor
e27d65f199 Introduce a "parent' context into oneof, struct, and class types. The
parent context encodes the generic arguments for outer generic types,
so that X<Int>.Nested and X<Float>.Nested are distinct types.


Swift SVN r2502
2012-08-01 23:20:36 +00:00
Doug Gregor
c1229e72a8 Give the methods, constructors, and destructors of a nested type a
polymorphic type when that type is nested within a generic type. The
type-checker still isn't ready to use these declarations in a sane way.



Swift SVN r2501
2012-08-01 21:16:06 +00:00
Ted Kremenek
81169fc0aa Reduce 'threading' of show colors logic through AST printer API, computing it in one central place.
Swift SVN r2499
2012-07-31 05:10:49 +00:00
Ted Kremenek
c03dce396b Hack up some initial support for coloring -ast-dump to make this easier to read.
Swift SVN r2498
2012-07-31 01:00:55 +00:00
Eli Friedman
76e6aa41b0 Change the computed type for OneOfElementDecls in OneOfs: for an Optional<T>, the OneOfElementDecl for Some now has type <T>(metatype<Optional<T>>) -> (T) -> Optional<T>, and the OneOfElementDecl for None has type <T>(metatype<Optional<T>>) -> Optional<T>.
The IRGen test is turned off because of another call-related IRGen crash (specifically, an indirect call of an indirect call crashes).



Swift SVN r2497
2012-07-30 23:31:23 +00:00
Eli Friedman
bb7cdf511c Add missing doc comment.
Swift SVN r2489
2012-07-28 06:52:48 +00:00
Eli Friedman
84e858da4e Fix static member functions so a member of type T has type "metatype<T> -> () -> ()" instead of "() -> ()".
This is much more convenient for IRGen, and gives us a reasonable representation for a static
polymorphic function on a polymorphic type.

I had to hack up irgen::emitArrayInjectionCall a bit to make the rest of this patch work; John, please
revert those bits once emitCallee is fixed.



Swift SVN r2488
2012-07-28 06:47:25 +00:00
Doug Gregor
3e5666d88c Introduce a set of substitutions into generic subscript
expressions. All accesses to members of generic types should now get
appropriate specialization information.


Swift SVN r2484
2012-07-27 19:11:07 +00:00
Doug Gregor
f66ca78037 Introduce a set of substitutions into GenericMemberRefExpr, so that we
have a record of how the member is being specialized for the given
context. To do this, I also had to patch up the DeclContext for
template parameters.


Swift SVN r2483
2012-07-27 18:49:09 +00:00
Doug Gregor
ea4cb398ed Destructors of generic class types have polymorphic function
type. This has remarkably little effect on type checking, because the
destructors themselves are never referenced by the AST after initially
type-checking them.


Swift SVN r2474
2012-07-27 06:38:32 +00:00
Doug Gregor
f4ced2028d Make the constructors of generic types polymorphic function types,
including the weird implicit one-of element declarations that end up in struct
types. Teach overload resolution and the type-checking of
ConstructorRefExprs how to specialize these polymorphic function types.


Swift SVN r2473
2012-07-27 06:33:04 +00:00
Doug Gregor
17422d5bee The type of an instance method in a generic class is actually a
polymorphic function type. For example, given

  struct X<T> {
    func f(a : T) -> Int { }
  }

The type of X.f is

  <T> (this : [byref] X<T>) -> (a : T) -> Int

If we have a call to f, e.g.,

  var xi : X<Int>
  xi.f(5)

it will be represented as X.f specialized to type

  (this : [byref] X<Int>) -> (a : Int) -> Int

and then called with 'xi' (DotSyntaxCallExpr) and finally 5
(ApplyExpr). The actual deduction of arguments is not as clean as I'd
like, generic functions of generic classes are unsupported, static
functions are broken, and constructors/destructors are broken. Fixes
for those cases will follow.



Swift SVN r2470
2012-07-27 00:24:32 +00:00
Doug Gregor
67c2354d28 When building archetypes, gather all of the archetypes (both primary
and derived) so they can be stored within the generic parameter list
for use 'later'.

More immediately, when we deduce arguments for a polymorphic function
type, check that all of the derived archetypes conform to all of the
protocol requirements, stashing that protocol-conformance information
in the coercion context (also for use 'later'). From a type-checking
perspective, we now actually verify requirements on associated types
such as the requirement on R.Element in, e.g.,

  func minElement<R : Range requires R.Element : Ordered>(range : R)
         -> R.Element



Swift SVN r2460
2012-07-26 00:24:05 +00:00
Eli Friedman
688138482d Complete the implementation of a basic Vector<T>.
Swift SVN r2457
2012-07-25 22:51:46 +00:00
Eli Friedman
ea6348f446 Make NewReferenceExpr inherit from ApplyExpr; this lets us delete some redundant code.
Swift SVN r2447
2012-07-25 20:55:51 +00:00
Doug Gregor
511dbfea25 When applying an operator found in a protocol, compute the effetive
base type (e.g., the archetype type, when we're in a generic function)
used to refer to that operator as a member, e.g., given

  func min<T : Ord>(x : T, y : T) {
    if y < x { return y } else { return x }
  }

'<' is found in the Ord protocol, and is referenced as

  archetype_member_ref_expr type='(lhs : T, rhs : T) -> Bool' decl=<
    (typeof_expr type='metatype<T>'))

using a new expression kind, TypeOfExpr, that simply produces a value
of metatype type for use as the base.

This solves half of the problem with operators in protocols; the other
half of the problem involves matching up operator requirements
appropriately when checking protocol conformance.


Swift SVN r2443
2012-07-25 16:04:30 +00:00
Eli Friedman
30d1f22bfb Rewrite the representation of NewReferenceExpr to make it more friendly to generics.
Generic constructors on classes should be working with this commit.



Swift SVN r2440
2012-07-25 00:49:03 +00:00
Doug Gregor
72e69d5420 Teach each archetype type to keep track of its nested types, so that
type substitution for a nested type reference (Foo.Bar.Wibble) whose
substituted parent reference (Foo.Bar) yields an archetype can simply
look for the appropriate nested type in the archetype. 

This allows us to eliminate the hideous ASTContext::AssociatedTypeMap
and simply the archetype builder.


Swift SVN r2438
2012-07-24 23:52:04 +00:00
Eli Friedman
751c463a2e Rewrite the way we represent construction of value types so that it looks
more like a call.  This should be enough to get generic constructors working.



Swift SVN r2437
2012-07-24 23:43:43 +00:00
Doug Gregor
aef8110375 Switch archetype assignment for protocols over to the archetype
builder. For this to work, the 'parameter' used to seed the archetype
builder is the 'This' associated type, which implicitly conforms to
the protocol. All other archetype assignments flow from that
archetype.

In the same vein, when faking a polymorphic function type for an
operator found within a protocol, we only need to substitute for the
'This' associated type. The rest are derived due to the implicit
requirement that 'This' conforms to its protocol.

Finally, because archetype assignment within protocols occurs during
type-checking, and that archetype assignment may visit any protocol
visible in the translation unit, we need to validate the types used in
archetype assignment for *all* protocols before attempting archetype
assignment on any one protocol. Thus, perform this type validation
before the main declaration type-checking phase.



Swift SVN r2436
2012-07-24 22:16:41 +00:00
Eli Friedman
b822876a6a Push TypeLocs through requires clauses.
Swift SVN r2432
2012-07-24 20:02:57 +00:00
Doug Gregor
2d0e61e3f4 When substituting into a nested type reference, build an appropriate
representation for the nested type:
  - If the type is nested within a deducible generic parameter type,
  build it as a nested type of that generic parameter type. (The
  terminology is bogus)
  - Otherwise, look for the member type of the given name and build a
  reference to it.



Swift SVN r2426
2012-07-24 16:01:20 +00:00
Eli Friedman
0f4d49385c Remove SourceLoc from ArraySliceType.
Swift SVN r2425
2012-07-24 06:29:36 +00:00
Doug Gregor
ce1c30f531 Switch the representation of archetype types so that it encodes when
an archetype is a nested type of another archetype. No functionality
change (yet).


Swift SVN r2416
2012-07-23 21:54:31 +00:00
Doug Gregor
a70818d513 Clamp down on same-type requirements that end up equating two generic
parameters together, e.g.,

  func f<T, U requires T == U>()

It's possible that we will allow this in the future.


Swift SVN r2413
2012-07-23 21:37:57 +00:00
Doug Gregor
7777cb22fe Clamp down on the types specified in requirements clauses a bit. The
subject of a conformance constraint (e.g., T : Foo) and both types of
a same-type constraint need to be generic parameters of nested types
thereof. The latter actually prohibits code like, e.g.,

  func f<R : Range requires R.Element == Int>()

which is something we may very well want to bring back into the
language in the future.


Swift SVN r2411
2012-07-23 21:13:33 +00:00
Doug Gregor
b6b094301f Eliminate the ridiculous string manipulation in the handling of
potential archetypes, replacing it with a 'parent' pointer that allows
a potential archetype to figure out its full name and its depth by
walking the parent chain. No actual functionality change.


Swift SVN r2409
2012-07-23 17:44:20 +00:00
John McCall
0eb93abb96 Add the ability to metaprogram nominal type declarations.
Swift SVN r2403
2012-07-23 07:35:21 +00:00
John McCall
39479b20ae Group all the builtin types together to allow some amount
of re-use.

Swift SVN r2394
2012-07-22 07:59:45 +00:00
John McCall
88679dbd2f Add a TypeVisitor class.
Swift SVN r2392
2012-07-22 07:59:32 +00:00
John McCall
da8c01938e Reorg, monster comment.
Swift SVN r2391
2012-07-22 07:59:22 +00:00
Eli Friedman
c6901f6a6c Initial parsing/AST for generic constructors.
Swift SVN r2387
2012-07-20 23:07:40 +00:00
John McCall
3950a6af41 Generic calls status code dump activate!
Swift SVN r2386
2012-07-20 21:59:14 +00:00