Commit Graph
979 Commits
Author SHA1 Message Date
josh11bandChandler Carruth d37dfd2fb8 Design overview update part 3: Safety (#1328)
This follows #1274 and #1325 and fills in the "safety" section. It only covers our approach in general terms.

Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
2022-06-14 13:22:22 -07:00
Richard Smith 392182cee1 Check for a symbolic value only if normal value lookup fails. (#1326)
This causes compile-time evaluation to give the same result as runtime
evaluation wherever possible. In particular, referencing a generic
parameter at compile time will resolve to the actual value if we're
evaluating a call to the enclosing function so a value for the
parameter is available in the call frame.

Clean up recently-added support for `SymbolicWitness`es using this.
2022-06-13 14:41:19 -07:00
bc40bdc279 Principle: All APIs are library APIs (#1280)
Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
Co-authored-by: Richard Smith <richard@metafoo.co.uk>
2022-06-13 13:10:43 -07:00
josh11bandChandler Carruth 504a4b1364 Design overview update part 2 (#1325)
This follows #1274 . It mainly fills in the "generics" section, with smaller updates to other section.

Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
2022-06-12 15:36:29 -07:00
Jeremy G. Siek b759401328 Heap allocation basics (#1323)
* initial implementation of new and delete

* remove requirement for empty heap from trace.carbon

* more tests

* fixed substitution for generic function types
2022-06-11 18:47:07 -04:00
Geoff Romer 6ab9c487be Restructure goals doc to reduce nesting. (#1319)
Prior to this change, the section headings for the 7 main goals are visually indistinguishable (in GitHub's rendering) from the boldfaced paragraph headings in those sections. This makes the doc hard to navigate because the structure is hidden.
2022-06-10 21:17:43 -07:00
Richard Smith b74d3f80f1 Add a new kind of Witness value that carries an expression (#1324)
This renames `Witness` to `ImplWitness` and adds a new form, `SymbolicWitness`, that holds an expression by which a witness can be computed. A common base class `Witness` is provided.

We form the new kind of witness when evaluation of a witness expression fails because the witness is not in scope, as happens when evaluating a subexpression such as a type expression in isolation, and retry evaluation in the larger context when the interpreter performs type instantiation when running the code.

This allows us to properly handle compile-time evaluation of constructs involving witness table lookups when the witness can be statically determined. The intent is that we will eventually also form symbolic witness table references when impl selection finds a non-final witness, in order to support specialization.

Simplify `NominalClassValue`: it can now always store a witness map rather than either a witness map or a witness-or-witness-expression map.
2022-06-10 14:16:54 -07:00
Richard Smith dd6ec2b4cb Improve test coverage after #1256. (#1286)
This change updated a test to use a different example to make sure a
diagnostic was still being exercised, but as a consequence lost test
coverage of the situation the test was originally intended to cover.

Add back the old test and put the new test into a different file.
2022-06-09 13:47:32 -07:00
b17e69aefd Design overview update part 1 (#1274)
Reorganizes the sections, and makes a pass filling in and updating the first sections including: types, functions, user-defined types. The following sections are left for part 2, including names, generics, and interop.

Also some smaller updates to, not revisiting the text: `pattern_matching.md`, `control_flow/return.md`, and `lexical_conventions/numeric_literals.md`

Co-authored-by: Geoff Romer <gromer@google.com>
Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
2022-06-09 12:58:22 -07:00
Richard Smith 9007b3952d Initial support for where expressions. (#1310)
Build constraint types from `where` expressions. This is very bare-bones; there's no support for constraining `.Self` or associated types yet, but degenerate cases not involving self-reference work.

`==` constraints are syntactically supported but not semantically verified yet, and they aren't used for anything.
2022-06-09 10:31:04 -07:00
Richard Smith 36b9d997b7 Disallow unexpected kinds of members in interfaces and impls. (#1318)
The syntax permitted in an `interface` is similar to, but different from, that permitted elsewhere. For example, associated constant declarations (`let T:! Type;`) with no initializers are valid in interfaces but nowhere else, and are a different kind of declaration from what a normal `let` declaration would produce both syntactically and semantically.

Because interfaces and impls permit only a very small subset of the complete set of kinds of declaration, it's simpler to list only the kinds that are permitted rather than to allow an arbitrary declaration and semantically disallow the invalid cases, and it's also likely to lead to better error messages as we won't try to parse unintended or meaningless things.
2022-06-09 09:31:56 -07:00
Jeremy G. Siek 873e78f605 cleanup and docs for tracing output (#1320)
* added documentation for tracing output, changed the printing of scopes to be part of the stack, made other minor changes hoping to enhance readability

* reformat a list in the README

* minor edit

* fix the lists

* updates to the interpreter/README.md
2022-06-09 11:18:21 -04:00
Jon Ross-Perkins 5ccea2c80b Link 'modern generics system', not just 'generics'. (#1317)
Tiny nit: Line 63 similarly links "modern generics system". Line 250 links 'generics', but doesn't include "modern ... system." So I think this approach is consistent (and subtly, implies the link is about the modern ... system, not just "generics").
2022-06-07 15:24:33 -07:00
Richard Smith 1bb370420b Initial support for constraints formed by combining interfaces (#1307)
Add scaffolding for constraints in general, and support specifically constraints formed by applying a `&` operator.

No support for constraints formed with `where` nor for named constraints at this point.
2022-06-07 13:59:23 -07:00
pk19604014 058b5e77c0 Use is_usable logic for recent continuation and choice recursive name lookup fixes (#1312) 2022-06-07 13:10:55 -07:00
Jonathan Ross-Perkins a97276bcf7 TODO -> FIXME (#1316)
This is for https://google.github.io/styleguide/cppguide.html#TODO_Comments; FIXME seems to be getting used for the same purpose, and we should probably only have one so that it's easier to scan for.
2022-06-07 10:49:17 -07:00
Jon Meow 8a515937fc Fix #include <vector> in code image (remove quotes) (#1314)
The text is correct.
2022-06-06 17:47:30 -07:00
b62b7464a4 Update and expand README content and motivation for Carbon (#1270)
Some review feedback from outside the team directly working on Carbon suggested
two pretty significant updates here. First, we didn't do a good job of
motivating Carbon. This takes two parts, first explaining what we'd like to
accomplish with this approach generally, and second explaining why alternative
approaches don't work. A particularly difficult case here is articulating
effectively the difficulties that motivate an approach other than improving C++
incrementally.

Co-authored-by: Jon Meow <jperkins@google.com>
Co-authored-by: josh11b <josh11b@users.noreply.github.com>
2022-06-06 17:16:27 -07:00
pk19604014 a033abed7c Cleanup chmod +x on update_checks.py + update a couple testdata entries with update_checks.py (#1313) 2022-06-06 13:13:05 -07:00
Richard Smith 96a663766c Remove support for nesting blocks within blocks. (#1309)
This is not part of the approved design and gets in the way of
supporting `where` expressions, which are part of the approved design.
2022-06-03 18:46:46 -07:00
pk19604014 035afdccff Added EnumKindName() for rtti enums + sample usage to print node kind names during type checking (#1305)
Sample trace output:

```
checking tuple pattern (v1: T1, v2: T2), expecting (T1:! ImplicitAs(U1), T2:! ImplicitAs(U2))
checking binding pattern v1: T1, expecting T1:! ImplicitAs(U1)
checking expression pattern T1
checking identifier expression T1
```
2022-06-02 16:16:51 -04:00
pk19604014 ccc6498993 Add alias name to name resolution after processing the target to avoid self-referencing name crash (#1295)
Fixes #1294
2022-06-02 12:47:41 -07:00
pk19604014 e206c3123f Removed .textproto extensions from explorer fuzzer corpus files + updated the corpus with regen_corpus.py (#1303)
Also added fuzzer_corpus to codespell precommit exclusions
2022-06-02 14:54:50 -04:00
pk19604014 1af8298580 Added a script for regenerating explorer fuzzer corpus (#1297)
Using libFuzzer coverage-based corpus merge feature -- https://llvm.org/docs/LibFuzzer.html#corpus
2022-06-01 16:19:21 -04:00
Darshal Shetty e4a2d0f047 Addr Keyword Implementation (#1255)
* Implement addr keyword

* Add files that were deleted during merge

Some files got deleted during merging trunk because of the executable
semantics rename.

* Implement changes from code review.

Major changes:
- Rename AddrBindingPattern to AddrPattern
- Fix AddrPattern related changes in fuzzing

* Update documentation for GetField

* Fix AddPattern according to @zygoloid's suggestions

* Apply @zygoloid's changes to method comment

* Add a multi-component field example

* Incorporate AST changes to fuzzer corpus

* Refactor the deduced_param_list grammar rule

Suggested by @zygoloid
2022-06-01 13:51:37 -04:00
pk19604014 f0572ee110 Added fuzzer crash samples as testdata entries (#1299)
For issues #1248, #1249, #1257, #1263
Before the samples were only recorded as fuzzer corpus files which are less 'durable'
2022-05-26 16:18:53 -07:00
pk19604014 ed93d95fce Allow unknown fields in fuzzing text proto (#1296)
This is to help with frequent build breakages cased by proto changes.
Fuzzer corpus can be periodically auto-regenerated.
Crashing samples from the fuzzer are better 'preserved' in the form of fail_xx.carbon tests.
2022-05-25 15:44:06 -07:00
pk19604014 5d184a4828 Refactoring: IsConcreteType() differs from IsType() only by the treatment of auto, made this more visible by merging the two into a single function (#1290) 2022-05-24 17:55:26 -07:00
pk19604014 19d2407de7 Similar to #1272, changed the type of alternative signature from generic Expression to TupleLiteral to match the grammar (#1291) 2022-05-24 17:53:49 -07:00
Richard Smith 4cf7ed4f12 Rename some classes to match the design better (#1287)
* `FieldAccessExpression` -> `SimpleMemberAccessExpression`
    * Member `aggregate` -> `object`
    * Member `field` -> `member`
* `CompoundFieldAccessExpression` -> `CompoundMemberAccessExpression`
* `GetField` -> `GetMember`

As discussed in #1233.
2022-05-24 17:51:54 -07:00
pk19604014 8b07d1ce5d Fuzz input fix for function type literal changed in #1272 (#1289)
This reverts commit aa7c98802c.
2022-05-24 10:36:53 -07:00
pk19604014 f0a34e4bf7 Added TypeCheckTypeExp() and changed function type literal and similar type-checking logic to use the new function (#1256) 2022-05-23 16:26:35 -07:00
pk19604014 cdc9428984 Changed the type of parameter in FunctionType ctor from generic Expression to TupleLiteral to match the grammar (#1272) 2022-05-20 17:36:17 -07:00
Richard Smith 8dd398807d Support user-defined implicit conversions via ImplicitAs (#1273)
Support is added for all of the non-type expression contexts where we currently accept built-in conversions, such as reordering the fields in a struct.
2022-05-20 17:10:30 -07:00
Richard Smith e77fcded86 Tidy up: rename arg_type and param_type to arg and param. (#1285)
Also improve doc comment.
2022-05-20 15:48:30 -07:00
Richard Smith 046a356002 Basic support for deduction of non-type values. (#1284) 2022-05-20 15:30:17 -07:00
Jon Meow 2e776a442d FIXME -> TODO for C++ style (#1282) 2022-05-20 14:28:25 -07:00
Richard Smith f33481e41f Unify logic for function calls and parameterized entity names. (#1281)
This improves diagnostics and adds support for cases like
```
class C(T:! Type, N:! T) {}
```
which we already supported in function calls.
2022-05-20 14:26:32 -07:00
Richard Smith 5c826df8bb Support deducing within the parameters of an interface type (#1278) 2022-05-19 17:49:28 -07:00
Jon Meow ec8cb07b90 Fix alias merge from #1267 (#1279) 2022-05-19 10:08:29 -07:00
Richard Smith a9bf3e5947 Support impl as in generic classes. (#1267)
Prepend the generic class's list of parameters onto the `impl`'s list of
deduced parameters, and add the `impl` to the impl scope enclosing the
class rather than adding it to the impl scope for the class body.

When matching an impl, deduce against both the type and the interface.

This incidentally slightly improves support for nested classes in generic classes, because they have some of the same properties as `impl`s nested in generic classes, but that's still a fair way from working for various unrelated reasons.
2022-05-19 08:49:47 -07:00
Richard Smith 30642927b0 Fix type of a choice value to be the choice type, not the type-of-choice type. (#1276) 2022-05-18 16:27:58 -07:00
pk19604014 b36c006a01 Change proto_to_carbon to use \x for escaping in string literals to be compatible with Carbon string parsing (#1266) 2022-05-18 08:57:00 -07:00
pk19604014 45b18098ed Add continuation name to name resolution after processing continuation body (#1264)
Fixes #1263

This makes the continuation behave similar to this C++ lambda construct - auto f = []() { f(); }; which doesn't compile.
2022-05-18 10:36:11 -04:00
josh11b eab34bee6b Link to Rust blog post about implied bounds (#1275) 2022-05-17 18:26:16 -07:00
pk19604014 88be617360 Changed ExpectReturnOnAllPaths() to treat continuation, run and await as missing returns (#1258)
Fixes #1257
2022-05-17 09:07:16 -07:00
josh11b fb0e8fa3bd Fix extra } in sample code (#1269) 2022-05-16 17:04:31 -07:00
Richard SmithandJon Meow 50d0561249 Initial support for aliases. (#1262)
This supports aliases for types (including interfaces), functions, parameterized types, instance member names, and interface member names.

Co-authored-by: Jon Meow <jperkins@google.com>
2022-05-16 16:31:38 -07:00
Richard Smith c48d024eea Produce a class value when converting {} to class type. (#1265)
Previously we missed this special case because {} results in a
StructType value not a StructValue value.
2022-05-16 16:18:32 -07:00
235cb88a8e Compound member access syntax. (#1233)
Implement initial support for `A.(B)` syntax, per #989. Specifically, this supports:

* `object.(Type.member)` for instance members,
* `object.(Interface.member)` for instance and non-instance members,
* `object.(Type.(Interface.member))` for instance members,
* `Type.(Interface.member)` for non-instance members.

Three new AST nodes are introduced:

* `CompoundFieldAccessExpression` represents the `A.(B)` syntax.
* `MemberName` is a `Value` that represents the result of evaluating an expression such as `Type.member` or `Interface.member` or `Type.(Interface.member)`.
* `TypeOfMemberName` is the type of a `MemberName` value.

In order to handle members of classes and interfaces which have corresponding declarations and may need substitution into their types, and members of structs which don't have declarations but also don't need substitution, a class `Member` is introduced that can refer to either of these kinds of member.

Co-authored-by: Geoff Romer <gromer@google.com>
Co-authored-by: Jon Meow <jperkins@google.com>
2022-05-13 16:52:41 -07:00