Commit Graph
2821 Commits
Author SHA1 Message Date
Richard Smith 3c4c234d01 Treat the empty inst block as being canonical. (#4199)
TryEvalInst was assuming this to be the case when forming canonical
constants, but it previously wasn't.

This fixes an issue where we can end up with two identical-looking
constants for an empty struct value: one with an `Empty` block and
another with the canonical empty block.
2024-08-07 21:58:28 +00:00
Jon Ross-Perkins 3d13b8f71c Fix handling of interface redefinitions. (#4198)
The prior code crashed when trying to find the function's `Self`
parameter, I believe. `fail_redefine_with_dependents.carbon` handles
this case. It wasn't caught by the prior case because the `F` didn't
have any dependent parameters.

Note this also ran into a formatter crash, with invalid constants. I'm
fixing that here, but will also note it on #4145 (the crash in
FinishGenericDecl was muddled by a crash in Formatter code).
2024-08-07 21:30:44 +00:00
Jon Ross-Perkins 0d106fbf90 Rename check/testdata/tuples to remove the plural (#4200)
This is just odd since other dirs aren't plural (struct, not structs),
and we do have parse/testdata/tuple
2024-08-07 21:05:11 +00:00
Richard Smith 91f56f72a5 Fix importing of generic types. (#4196)
Ensure we don't lose the symbolic constant value by mapping through to
the underlying inst ID.
2024-08-07 19:12:00 +00:00
Richard Smith f0fd1d2342 Clean up: use across-decl comparison comparing interface. (#4195)
This doesn't seem to be observable because we don't support
parameterized impls. But it's consistent with how we compare the type
portion of the impl.
2024-08-07 16:21:40 +00:00
Richard Smith 2a06c964b5 Fix formatting for imported impls. (#4194)
`impl`s may be defined even if they have no scope if they were imported.
2024-08-07 15:58:53 +00:00
josh11bandJosh L ab5fa938ab Fix typo introduced in #4167 (#4197)
Co-authored-by: Josh L <josh11b@users.noreply.github.com>
2024-08-07 02:22:15 +00:00
Jon Ross-Perkins 17abaa2bca Fix stray quote in action (#4193) v0.0.0-0.nightly.2024.08.07 2024-08-06 23:31:44 +00:00
Jon Ross-Perkins b73387fc84 Update workflows for security hardening. (#4192)
Also a small pass on workflow names.

Note, I'm a little concerned that the test/nightly release/pre-commit
endpoints may be fragile. At the same time, it's also where it may be
most useful, to prevent network access by arbitrary test code. I think
this is imperfect, but maybe we can try it out and see if it's much of
an issue.

Note, the discord wiki action is currently broken, this should fix it.
2024-08-06 23:14:23 +00:00
Richard SmithandJon Ross-Perkins 1705347375 Perform an extra pass to import a generic for a symbolic constant less often. (#4182)
Instead of always forcing an extra pass when we need to import a generic
ID for a generic that isn't already imported, attempt to import the
rest of the instruction in the same pass. There are then three
possibilities:

- The instruction needs a retry anyway to form its constant value, and
  we avoid an extra pass.
- The instruction produces its constant value on the first pass but
  still needs a retry. In this case, the handler for that instruction
  is expected to retry itself, before building its constant value. The
  third pass in this case can't be avoided.
- The instruction succeeds on its first pass. We still need an extra
  pass; track the constant produced by resolution separately.

---------

Co-authored-by: Jon Ross-Perkins <jperkins@google.com>
2024-08-06 20:27:47 +00:00
Richard Smith f6ff5b11b5 Distinguish between whether an entity has its own parameter lists and whether it is generic. (#4191)
It's actually possible to get into all four combinations of having
parameter lists versus being generic:

- An entity nested within a generic, such as a member class, can be
generic even if it has no parameters.

- As a corner case, an entity with an *empty* parameter list has
parameter lists, but isn't a generic because it doesn't have any generic
parameters.
2024-08-06 15:50:27 +00:00
Richard Smith 8a8c227163 Track an interface type, not an interface ID, on an associated entity. (#4188)
This prepares us for modeling associated entities of parameterized
interfaces.

We don't use the interface parameters when type-checking `impl`s or uses
of interface members yet, but we do now check interface arguments during
`impl` lookup.
v0.0.0-0.nightly.2024.08.06
2024-08-05 20:45:14 +00:00
Chandler Carruth 183c8c0ccf Re-enable TCMalloc on Linux builds. (#4187)
This tripped up the Compiler Explorer sandbox, but we think that is now
fixed:
https://github.com/compiler-explorer/compiler-explorer/issues/6734

Removing the workaround here, and once it's live and not crashing we can
close #4176 as fixed (and without a temporary workaround).
2024-08-05 14:28:02 +00:00
Jon Ross-Perkins d9a550a7d5 Support 'bazel run //examples:sieve' (#4185)
#4076 changed the rule setup and incidentally stopped supporting `bazel
run`. This should make `bazel run` work again.
v0.0.0-0.nightly.2024.08.05
2024-08-04 03:00:40 +00:00
Richard Smith b3fcaf9969 Initial rough support for deducing generic arguments in a call to a generic function. (#4184) v0.0.0-0.nightly.2024.08.04 v0.0.0-0.nightly.2024.08.03 2024-08-02 22:44:51 +00:00
David Blaikie d72b4e4151 Remove supurfluous/confusing {} around a temporary (#4183)
This was failing to build for me locally with some arbitrary Clang HEAD
host compiler:
```
migrate_cpp/rewriter.cpp:225:3: error: call to member function 'SetReplacement' is ambiguous
  225 |   SetReplacement(expr, {OutputSegment(std::move(text))});
      |   ^~~~~~~~~~~~~~
./migrate_cpp/rewriter.h:141:8: note: candidate function [with T = clang::IntegerLiteral]
  141 |   auto SetReplacement(const T* node, std::vector<OutputSegment> output_segments)
      |        ^
./migrate_cpp/rewriter.h:150:8: note: candidate function [with T = clang::IntegerLiteral]
  150 |   auto SetReplacement(const T* node, OutputSegment segment) -> void {
      |        ^
```
No idea if that's a bug in clang HEAD, but it seemed like removing the
{} simplified the code anyway - so here's that.
v0.0.0-0.nightly.2024.08.02
2024-08-01 22:32:57 +00:00
Richard Smith a9b43a222f When importing symbolic constants and types, also import the associated generic and index. (#4180)
A symbolic constant has an instruction to compute the constant value, as
well as potentially also having a generic ID and an index within that
generic to indicate where corresponding values can be found in a
specific. Import those pieces of information when importing such a
constant.

We try to import the generic before we start the main work of importing
the constant, and retry the import process if importing the generic adds
work to the worklist. This means that the first time we import anything
within a generic, we can now perform three passes calling
`TryResolveInst` instead of two, but the first pass is very lightweight
and only looks up and adds a single instruction, so the added overhead
of the extra pass should be minimal.

To avoid introducing cycles when importing a generic function, make the
import of a function declaration build the new `Function`,
`FunctionDecl`, and `FunctionType` in the first pass, like classes and
interfaces do.
2024-08-01 21:02:46 +00:00
Richard Smith 3c8fc714a8 Import support for generics and specifics (#4179)
Import generics and specifics when they are referenced by imported
entities.

When importing a generic, we import the symbolic constants required by
its eval block, and then rebuild the eval block itself given the list of
constants it needs to compute. This is likely a bit less efficient than
directly importing the contents of the eval block, but avoids needing to
either extend the importer code to be able to import the instructions
that can appear in the eval block or extend the evaluator to cope with
instructions from a different `SemIR::File`.

Importing a symbolic constant is unaffected, and does not yet preserve
the associated generic and index within that generic, so uses of a
generic from an imported IR still don't pick up values from the
specific, but the improved functionality can be seen in the changes to
the SemIR in the testcases.
v0.0.0-0.nightly.2024.08.01
2024-07-31 23:53:14 +00:00
Jon Ross-Perkins f67791cfee Separate subtree size information from parse nodes. (#4174)
Move subtree sizes over to TreeAndSubtrees, using the different
structure to represent the additional parse work that occurs, as well as
making it clear which functions require the extra information. My intent
is to make it hard to use this by accident.

The subtree size is still tracked during Parse::Tree construction. I
think a lot of that can be cleaned up, although we use it during
placeholder assignment so it may take some work. I wanted to see what
people thought about this before taking action on such a change.

I'm using a 1m line source file generated by #4124 for testing. Command
is `time bazel-bin/toolchain/install/prefix_root/bin/carbon compile
--phase=check --dump-mem-usage ~/tmp/data.carbon`

At head, what I'm seeing is:

```
...
parse_tree_.node_impls_:
  used_bytes:      61516116
  reserved_bytes:  61516116
...
Total:
  used_bytes:      447814230
  reserved_bytes:  551663894
...
1.43s user 0.14s system 99% cpu 1.565 total
```

With `Tree::Verify` disabled completely, it looks like:
```
parse_tree_.node_impls_:
  used_bytes:      41010744
  reserved_bytes:  41010744
...
Total:
  used_bytes:      427308858
  reserved_bytes:  531158522
...
1.20s user 0.13s system 99% cpu 1.332 total
```

Re-enabling just the basic verification (what is now `Tree::Verify`),
I'm seeing maybe 0.05s slower, but that's within noise for my system. I
do see variability in my timing results, and overall I think this is a
0.2s +/- 0.1s improvement versus the earlier (always testing `Extract`
code) implementation. That's opt; debug builds will be unaffected,
because the same checking occurs as before.

Note, the subtree size is a third of the node representation, which is
why I'm showing the decrease in memory usage here.
2024-07-31 19:39:45 +00:00
Richard Smith e6e61e14ae Fix incorrect value_id and location in imported BindSymbolicName. (#4178)
Instead of updating the `value_id` on the canonical constant
`BindSymbolicName` to refer to some particular instance of that
constant, create a new instruction, and attach the proper location to
it.
2024-07-31 16:38:56 +00:00
Jon Ross-Perkins c31c03acb3 Temporarily disable tcmalloc due to compiler-explorer crash (#4177)
Per @axsaucedo on #4176, tcmalloc expects cpu information that
compiler-explorer is lacking in its sandboxing. There's probably a
better fix to be had, this is intended to be temporary.
v0.0.0-0.nightly.2024.07.31 v0.0.0-0.nightly.2024.07.30
2024-07-29 15:50:57 +00:00
Jon Ross-Perkins 43c0b0a1f2 Refactor some check-phase postorder iterator use. (#4175)
Allow directly constructing a PostorderIterator, to get rid of
`tree.postorder(node_id).end()` indirect construction. For ranges that
don't need tree data, make it clearer that they're not validated.

Note, this subtly gets rid of a subtree size use in the
`tree.postorder(node_id).end()` case (to get the discarded `begin()`
value).
v0.0.0-0.nightly.2024.07.29 v0.0.0-0.nightly.2024.07.28
2024-07-27 02:15:56 +00:00
Jon Ross-Perkins 66147dee4f Refactor some commonality in formatter. (#4171)
Also tries to add comments for things. Note, I'm trying to improve
understandability here, so if you don't think this is helping I can undo
things.
v0.0.0-0.nightly.2024.07.27
2024-07-26 21:00:50 +00:00
Jon Ross-Perkins ae675e61bd Add initial parsing for 'extern library' (#4173) 2024-07-26 20:47:25 +00:00
Richard Smith 37a8bfa488 Refactor ReturnTypeInfo and InitRepr. (#4169)
Rename `ReturnInfo` to `ReturnTypeInfo`. Move it and `InitRepr` into
`type_info.h` alongside `ValueRepr`. Replace `ReturnSlot` with
`InitRepr`, and extend `InitRepr` to be able to represent the
incomplete-type case instead of CHECK-failing. Remove `has_return_slot`
from `InitRepr` and instead only provide that as part of
`ReturnTypeInfo`.
v0.0.0-0.nightly.2024.07.26
2024-07-25 21:41:33 +00:00
Richard Smith 2ef1d1f8b9 Move definition of member of Function to function.cpp where it belongs. (#4170) 2024-07-25 21:22:07 +00:00
Jon Ross-Perkins fbb1cd36c0 Only produce a name scope for a namespace when not merged (#4168)
Addresses the comment on
https://github.com/carbon-language/carbon-lang/pull/4153#discussion_r1690292168
(although maybe with somewhat quirky results, since contents get printed
each time)
2024-07-25 21:05:10 +00:00
Jon Ross-Perkins 1fc488da10 Improve notes on MODULE.bazel.lock changes (#4167)
I admit I'm tempted to make a MODULE.bazel.md for these comments, so
that modifying them doesn't trigger a lockfile update, but I don't
really want it at the top level.
2024-07-25 20:35:30 +00:00
Richard Smith a9e835f3dc Remove caching of return slot usage. (#4163)
The caching isn't buying us much, and is adding complexity and
divergence between the codepaths for generic and non-generic functions.

This means we no longer suppress diagnostics for the second or
subsequent time we call a function with an incomplete return type. If we
want to add that back, it might be worth considering moving the
suppression to `TryToCompleteType` and only diagnosing that a type is
incomplete once, regardless of why we're requiring it to be complete.
2024-07-25 20:29:59 +00:00
Brymer Meneses bf1106fc34 fix: clangd: -32001: invalid AST (#4164)
Ignore the `-march=*` in `compile_commands.json` which causes issues in
Neovim on Apple M2. This fix is from this
[comment](https://github.com/clangd/clangd/issues/1582#issuecomment-1500031372)
2024-07-25 16:51:31 +00:00
Richard Smith 3cb769a053 Rename "generic instance" to "specific" throughout the toolchain. (#4165)
As discussed in toolchain meeting, we want to avoid overloading the
meaning of "instance", and "specific" was the best name we found. It's a
little unorthodox and inventive, but hopefully over time will become as
unsurprising as the term "generic" is.
2024-07-25 16:42:01 +00:00
Brymer Meneses 70c20be91b docs: add a note on setting up clangd (#4135)
This PR adds a note on how to generate `compile_commands.json` which is
necessary for having `clangd` generate accurate diagnostics
2024-07-25 16:40:27 +00:00
Jon Ross-Perkins bf89652a4d Move common entity fields to a 'base' struct. (#4161)
I'd considered moving DeclParams uses over, but when handling qualified
names, there's a parse node instead of an instruction. I did try to
unify a couple other uses though, including adding MergeDefinition. I
expect `interface` will use a little more once it's more completely
implemented, but maybe I'm wrong about that.
2024-07-24 23:26:00 +00:00
Richard Smith a0973f4f47 When reentering an interface scope, reintroduce the Self parameter. (#4162)
This is not easy to test right now, because it should only really be
visible through `default fn` declarations, which we don't support
properly yet.
2024-07-24 22:31:24 +00:00
Richard Smith 07bad72d86 Support for calling non-generic methods in a specific class. (#4156)
Use the specific parameter types for checking, and the specific return
type as the type of the call.
2024-07-24 20:27:01 +00:00
Jon Ross-PerkinsandRichard Smith 7ded56ef35 Improve namespace handling in imports. (#4153)
This implements a few closely related features:

- Starts merging namespaces discovered inside imports.
- Stores results of cross-package name lookup as an entry inside the
scope.
  - Note this is particularly visible with `i32`.
- Moves more of the imported instructions to the import scope.

Note this is primarily for executing the namespace TODO in check.cpp,
which is removed here.
`testdata/namespace/merging_with_indirections.carbon` tests key
behavior.

---------

Co-authored-by: Richard Smith <richard@metafoo.co.uk>
2024-07-24 19:56:17 +00:00
Chandler CarruthandJon Ross-Perkins 55f3f48707 Add a mention of our nightly builds to our README.md. (#4158)
This provides an example of downloading and using the nightly buildings
of the toolchain. I've tried to provide appropriate caveats about the
fact that this is very early and not something that's really reliable.
But I wanted folks to know how they can play with the nightly releases
if they're interested.

I've also focused the source build instructions on the toolchain where
we'd be interested in contributions, and the first paragraph on trying
out Carbon in the browser with CE.

---------

Co-authored-by: Jon Ross-Perkins <jperkins@google.com>
2024-07-24 19:30:40 +00:00
Richard Smith d625607510 Convert EvalContext into a class. (#4160) 2024-07-24 15:45:06 +00:00
Richard Smith 83157f3d24 Remove overeager CHECK. (#4159)
When evaluating within the context of a specific, we can encounter uses
of bindings that are nested within that specific, for example parts of
the declaration of a nested generic. Those bindings should evaluate to
the canonical form of themselves, as they would when evaluating outside
the context of the specific.

Fixes #4157.
v0.0.0-0.nightly.2024.07.24
2024-07-23 23:21:47 +00:00
Richard Smith fc8e686607 Rebuild all constants in the eval block. (#4155)
Instead of reusing instructions from the generic entity in the eval
block, rebuild constants in the same way we rebuild types. The previous
attempt to not rebuild these constants assumed that every constant used
in a generic would be built in that generic, and not referenced directly
or referenced from some enclosing scope, which isn't true in practice
and is a fragile assumption in any case.

We could add back some reuse of instructions from the generic -- if we
happen to see the right instruction to build a constant, we could
opportunistically reuse it -- but given the complexity added by doing
so, I'm not pursuing that here.

Now that the eval block for a generic consists of instructions uniquely
owned by that generic, rather than often being shared with another
entity, include the generic in the formatted SemIR output. I'm using the
same scope name for the generic object itself as for the parameterized
class / function / interface, because there are very frequently
references between them and this keeps the IR simpler and more readable,
and avoids needing to invent a second name for the scope.
2024-07-23 21:51:08 +00:00
Jon Ross-Perkins db022658c6 Implement syntactic merge checks for parameters. (#4149)
Note this isn't implementing checking through imports. The parse node
there is harder to access through the context, so would require
examining the entity in order to get the import declaration, to get at
the ImportIR. We also don't have a parse tree attached in that case, and
would need to add one to SemIR::File. But I believe we do want to add
that, so it's explicitly a TODO.

Note GetTokenText re-lexes literal values, so there's a bit of potential
overhead there. Not sure if we want a more efficient manner for
comparing in cases like this.
2024-07-23 20:32:24 +00:00
Jon Ross-PerkinsandGeoff Romer 07c286e3cb Use the package/library name in ImportIRId formatting. (#4154)
Also adds import_ir_scope to namespace formatting. I'd done this as an
aid for #4153, and am splitting it out.

---------

Co-authored-by: Geoff Romer <gromer@google.com>
v0.0.0-0.nightly.2024.07.23
2024-07-22 22:43:36 +00:00
Jon Ross-Perkins 000d6d63ef Remove already-done no_prelude todo. (#4148) 2024-07-22 21:41:35 +00:00
Richard Smith 4a8a7bf6aa Remove declaration of function deleted in #4150. (#4151) 2024-07-22 17:26:58 +00:00
Geoff Romer 326609857d Rename BindNameInfo to EntityName (#4090) v0.0.0-0.nightly.2024.07.22 v0.0.0-0.nightly.2024.07.21 v0.0.0-0.nightly.2024.07.20 2024-07-19 22:43:50 +00:00
Jon Ross-Perkins 4c6dc2eade Remove irregular digit placement check from NumericLiteral. (#4150)
This changed in #1983 and although we updated explorer, we missed
toolchain.
2024-07-19 20:46:25 +00:00
Jon Ross-Perkins 7b1a5dfc58 Try some crash recovery in autoupdate threads. (#4147)
At present, I think if we crash from multiple threads in parallel, it
can lead to the stack trace not being printed out. Using
CrashRecoveryContext here seems to more successfully print a stack trace
on errors, which I'm hoping will ease debugging.

i.e., before:

```
-----------------------------------------------------------------------------
.Please report issues to https://github.com/carbon-language/carbon-lang/issues and include the crash backtrace.
Stack dump:
0.	performing autoupdate for toolchain/check/testdata/alias/no_prelude/import_order.carbon
1.	Program arguments: compile --phase=check --dump-sem-ir --no-prelude-import --exclude-dump-file-prefix=/usr/local/google/home/jperkins/.cache/bazel/_bazel_jper.kins/85deb7d9d96f7e0e80b42618a55969d7/execroot/_main/bazel-out/k8-fastbuild/b.in/toolchain/install/prefix_root/lib/carbon/../../lib/carbon/core a.carbon b.carbon
.CHECK failure at ./toolchain/sem_ir/ids.h:140: is_valid()
CHECK failure at ./toolchain/sem_ir/ids.h:140: is_valid()
external/bazel_tools/tools/test/test-setup.sh: line 328: 1151859 Aborted                 "${TEST_PATH}" "$@" 2>&1
```

(EOF)

after:

```
-----------------------------------------------------------------------------
Please report issues to https://github.com/carbon-language/carbon-lang/issues and include the crash backtrace.
Stack dump:
0.	performing autoupdate for toolchain/check/testdata/alias/no_prelude/import_order.carbon
1.	Program arguments: compile --phase=check --dump-sem-ir --no-prelude-import --exclude-dump-file-prefix=/usr/local/google/home/jperkins/.cache/bazel/_bazel_jperkins/85deb7d9d96f7e0e80b42618a55969d7/execroot/_main/bazel-out/k8-fastbuild/bin/toolchain/install/prefix_root/lib/carbon/../../lib/carbon/core a.carbon b.carbon
..CHECK failure at ./toolchain/sem_ir/ids.h:140: is_valid()
CHECK failure at ./toolchain/sem_ir/ids.h:140: is_valid()
......CHECK failure at ./toolchain/sem_ir/ids.h:140: is_valid()
CHECK failure at ./toolchain/sem_ir/ids.h:140: is_valid()
.....................................................................................CHECK failure at ./toolchain/sem_ir/ids.h:140: is_valid()
.CHECK failure at ./toolchain/sem_ir/ids.h:140: is_valid()
............................ #0 0x000056045ee22d7d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/local/google/home/jperkins/.cache/bazel/_bazel_jperkins/85deb7d9d96f7e0e80b42618a55969d7/execroot/_main/bazel-out/k8-fastbuild/bin/toolchain/testing/file_test.runfiles/_main/toolchain/testing/file_test+0x731dd7d)
```

(elided the full stack trace)
v0.0.0-0.nightly.2024.07.19
2024-07-18 21:36:29 +00:00
Jon Ross-Perkins e76b6a61b4 Abbreviate instruction as inst in formatter. (#4146)
This is just consistency with other abbreviating we're doing.
2024-07-18 19:34:01 +00:00
Chandler Carruth 44c85e0872 Reserve memory for the identifiers hashtable. (#4107)
This uses a heuristic reserve to greatly reduce hashtable growth of the
identifiers hashtable. The design of the hashtable itself is optimized
around compact memory use and is especially slow to grow and so this has
an outsized impact.

The heuristic was computed using `scripts/source_stats.py` and looking
at C++ codebases. We may want to periodically re-evaluate it as Carbon
code emerges and we have better data on its distributions of tokens.

This also required fixing the `Reserve` method on `CanonicalValueStore`
that wasn't actually used anywhere and so didn't even compile correctly.
I added it to the relevant unit test so it is at least compiled locally
to its definition.
2024-07-18 15:41:21 +00:00
Richard Smith 1ed58895bc Basic testing for generic methods using Self. (#4143) v0.0.0-0.nightly.2024.07.18 2024-07-17 23:27:40 +00:00