Commit Graph

532 Commits

Author SHA1 Message Date
Josh Bleecher Snyder 57d2ff39c7 go/ast/astutil: match prefix segments when adding imports
AddImport and AddNamedImport attempt to place new
imports in roughly the correct place--and thus the
correct group--by matching prefixes. Matching prefixes
byte-by-byte led to "regexp" being grouped with "rsc.io/p".
Instead, match prefixes by segments.

Fixes golang/go#9961.

Change-Id: I52b7c58a9a2fbe85c2b5297e50c87d409364bda3
Reviewed-on: https://go-review.googlesource.com/8090
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-03-30 17:57:25 +00:00
Robert Griesemer af0a4481dd go/types: permit type elision from composite literal map keys
Per pending https://go-review.googlesource.com/2591 .
Depends on: https://go-review.googlesource.com/2621 .

Change-Id: I2aa82916454504b5852518b3ef7fc8637126d0c7
Reviewed-on: https://go-review.googlesource.com/2623
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-03-20 22:18:24 +00:00
Alan Donovan bd8de46c84 go/ssa/interp/testdata: remove comment about now-fixed go/types bug
Change-Id: I55372a40c0049368a74247fe1819be384313f838
Reviewed-on: https://go-review.googlesource.com/7666
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-03-17 17:28:01 +00:00
Alan Donovan 33fcc815f2 go/ssa: fix incorrect SSA code for composite literals
Composite literals are initialized in place where possible, but in
cases the initializer expression refers to the variable that
is being updated

	x = T{a: x.a}

we must ensure that the RHS is fully evaluated before we execute any
stores to x.  This means we need to record the sequence of stores in a
"store buffer" and execute it only once the entire composite literal
has been evaluated.

Fixes issue #10127

Change-Id: If94e3b179beb25feea5b298ed43de6a199aaf347
Reviewed-on: https://go-review.googlesource.com/7533
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-03-17 14:26:39 +00:00
Robert Griesemer e4a1c78f0f go/types: typecheck loop body even if range clause is broken
Be more tolerant in the presence of incorrect range clauses
if for loops and type-check loop body with minimal assumptions
about iteration variables. (Before, in some cases we would simply
ignore the loop body in such cases).

Fixes #10148.

Change-Id: I0b66f81875348088c1a7fa04ccdcbfe768f2eb6c
Reviewed-on: https://go-review.googlesource.com/7525
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-03-13 23:02:41 +00:00
Alan Donovan 868c429971 go/ssa/interp: fix bug causing subelements of aggregates to change address.
Since all SSA values are immutable, no value copying is required for
any operations except those that load from or store to a variable;
those operations must do an aggregate copy, i.e., descend into struct
and array elements.  All other calls to copyVal have been removed;
they were pieces of duct tape, as I had long suspected.

The descent must be based on the static type information, not the
"shape" of the dynamic value, since two reflect.Value structs may have
different internal shapes.  We clobber the true definition of
reflect.Value's underlying type, replacing it with struct{interface{},
interface{}}, which is close enough to make the load/store functions
work.

+ Test

Change-Id: I5e239d91ed0cb2a669a9f75766024fe1f9a5c347
Reviewed-on: https://go-review.googlesource.com/7532
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-03-13 18:22:38 +00:00
Alan Donovan 8cc1c75580 go/loader: support relative imports like the go tool does
Config.Cwd sets the base directory; os.Getwd is its default.

+Test.

Change-Id: I213abfb30085cd1306719ed6f94aeae6a3170bc0
Reviewed-on: https://go-review.googlesource.com/7502
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-03-12 18:51:46 +00:00
Alan Donovan bdcea2c1b3 go/buildutil: use chan (not func) in the ForEachPackage API
The callbacks are intentionally concurrent, making this function very
easy to misuse (most clients so far have got it wrong, even my own).
Using a channel in the API makes the concurrency obvious, the
correct usage easy, and the client control flow simpler.

Change-Id: Ied38c3ed5c98b40eb1b322a984ed9dc092ac0918
Reviewed-on: https://go-review.googlesource.com/3250
Reviewed-by: Sameer Ajmani <sameer@golang.org>
2015-03-05 20:14:20 +00:00
Alan Donovan 9957739054 go/ssa: treat declared init functions less specially
Before this change, declared init functions were not package members;
this choice dates from when go/types did not create Func objects for them.

Now, they have an Object.  They appear in Members, keyed by "init#%d"
(sequence number) for uniqueness.  They can be enumerated.  They can
be looked up from a *types.Func via (*Program).FuncValue.

Caveat: fn.Object.Name() no longer equals fn.Name() in all cases.

NB: incompatible API change!  (Your build will not break though.)

Change-Id: I2de873079fd57329e6c2f55a282940f6699a77a1
Reviewed-on: https://go-review.googlesource.com/6950
Reviewed-by: Robert Griesemer <gri@golang.org>
Reviewed-by: Peter Collingbourne <pcc@google.com>
2015-03-05 20:09:21 +00:00
Robert Griesemer 133ecf9210 go/types: better error message for use of _ in type switch
Change-Id: If690d2d9607b3632451df2681c293835321ed9bd
Reviewed-on: https://go-review.googlesource.com/6413
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-03-02 18:58:57 +00:00
Alan Donovan 8913eaef75 go/loader: name unnamed packages so errors make sense
Add tests for:
- this naming
- missing file in created package

Change-Id: I07c66b66e845c52d4685509c362b34f1f0c92648
Reviewed-on: https://go-review.googlesource.com/6310
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-02-27 22:39:28 +00:00
Alan Donovan 69db398fe0 go/loader: rename SourceImports flag to ImportFromBinary and invert sense
...since the zero value is more useful by far.

This is a breaking API change, obviously.  (One or two tests in this
CL have intentional been left using the zero value, i.e., they now
load source.)

Change-Id: I42287bfcdb1afef8ee84e5eac12534dd0a1fd5d2
Reviewed-on: https://go-review.googlesource.com/5653
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-02-23 23:01:10 +00:00
Alan Donovan 51931f86bf go/loader: define a FindPackage hook for build systems not compatible with "go build".
Google's proprietary build system, for example, does not use the
_test.go suffix to distinguish test from non-test files; this
information is stated explicitly in another form.

Change-Id: I3a8e919dbc556b6d5cfea1d2123da2616bd934d4
Reviewed-on: https://go-review.googlesource.com/5450
Reviewed-by: David Crawshaw <crawshaw@golang.org>
2015-02-20 17:56:13 +00:00
Alan Donovan f96426939c go/ssa: minor doc tweaks.
Change-Id: I116405d5014e4f2bccfff91e01945e10feacf9ee
Reviewed-on: https://go-review.googlesource.com/5442
Reviewed-by: David Crawshaw <crawshaw@golang.org>
2015-02-20 16:00:52 +00:00
Alan Donovan 9bdc591373 go/ssa: standardize parsing of BuilderMode flags.
ssadump's -build=G option is now spelled -import; it was never related to ssa.

Change-Id: Ic21cd8b6990c0ffd25651c17a842a63bfa5019cf
Reviewed-on: https://go-review.googlesource.com/5172
Reviewed-by: David Crawshaw <crawshaw@golang.org>
2015-02-18 18:34:24 +00:00
Robert Griesemer 229cb67603 go/gccgoimporter: disable test case (fix build, at least partially)
Change-Id: I021c4b4525006d27dd63f6eee16a5d219f6ba9dc
Reviewed-on: https://go-review.googlesource.com/4750
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-02-12 21:45:02 +00:00
Robert Griesemer fa3649f71f go/types: don't permit implicit assignments to unexported struct fields via literals
Change-Id: I74eec172ba5a319f91c95e33b047f489dfce0c95
Reviewed-on: https://go-review.googlesource.com/4090
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-02-06 20:42:57 +00:00
Alan Donovan 0dda50d42a go/loader: improve robustness in face of input errors
Before this change, many kinds of error would cause the loader to stop.
    making it brittle when analyzing large codebases, as in "godoc -analysis".

    This change moves operations that used to occur during
    configuration---(*build.Context).Import, loading, and parsing of
    initial packages---into the Load call, and ensures that all failures
    during Loading are reported at the end so that the maximum amount of
    progress is made.

    Also: redesign the tests and add many new cases.

Change-Id: Ia8cd99416af7c5d4a5fe133908adfa83676d401f
Reviewed-on: https://go-review.googlesource.com/3626
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-02-02 20:01:59 +00:00
Robert Griesemer 1afe783e9f go/types: update testdata (fix build)
Change-Id: Ifd38444c7c22f65f6e85fe6233b01703d1d14b4f
Reviewed-on: https://go-review.googlesource.com/3540
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-01-29 22:22:27 +00:00
Alan Donovan d569772660 Extend duplicate check to exported wrappers
Change-Id: I892fca0a374476aa9e65bf26fb03b73d6a0ae75a
Reviewed-on: https://go-review.googlesource.com/1583
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-01-23 18:36:53 +00:00
Alex Brainman 2ef5a0d23b refactor/rename: make tests pass on windows (fixes build)
- use import path not file path in go/buildutil.FakeContext OpenFile;
- use regexp to compare error messages in TestErrors, because
  they contain windows file paths;
- use OS file path (not unix path), when checking move results
  in TestMoves.

Change-Id: Ib62d344acb551fb612d8a0773ae1ab5f18341294
Reviewed-on: https://go-review.googlesource.com/3171
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-01-23 05:30:55 +00:00
Alan Donovan 96af1504f6 go/ssa: add list-of-tests constant to generated testmain package
And log its value in godoc -analysis.

Related to issue 8968

Change-Id: I96a96922a3fa5c434c69e0faff1cc8ec4686b6f2
Reviewed-on: https://go-review.googlesource.com/3154
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-01-22 22:45:41 +00:00
Alan Donovan f011631cea go/ssa: simplify TypesWithMethodSets
Details:
- rename (*Program).TypesWithMethodSets() to RuntimeTypes()
- delete (*Package).TypesWithMethodSets() method and simplify
- move code to methods.go
- update test to use

1-2% improvement in space and time (though I barely trust this data
because the GC at tip is in such terrible state).

Change-Id: I38eab78b11e0ad0ff16e0530e775b6ff6a2ab246
Reviewed-on: https://go-review.googlesource.com/3148
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-01-22 14:03:32 +00:00
Alan Donovan e079f6c632 go/ssa: change import path of synthetic test package to "test$main"
...to avoid namespace conflicts.
Also make its name "main", since it defines func main().

And fix 2 typos.

Change-Id: I7cf7894d6bed134907b3d2742255e5a82426071b
Reviewed-on: https://go-review.googlesource.com/3150
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-01-21 22:21:01 +00:00
Alan Donovan 4d45c85020 go/types: expose IsInterface predicate, eliminating 6 copies
Change-Id: I3704d7bd7a11f691c66556c1b77ef79a503d2fe9
Reviewed-on: https://go-review.googlesource.com/2173
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-01-21 18:49:27 +00:00
Alan Donovan 771af7e25c go/buildutil: FakeContext: create build.Context of fake file tree, for testing
This refactoring of the tests of go/loader and refactor/rename made it
possible to write some loader tests I wanted, but the new tests reveal
bugs so they're commented out for now.  I will fix them in a follow-up.

Change-Id: Iae3a20681a0a0791076debd4b82bb5ed74b0c577
Reviewed-on: https://go-review.googlesource.com/2825
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-01-15 22:46:57 +00:00
Alan Donovan 9c9660e35a go/loader: use concurrency to reduce I/O latency and perform typechecking in parallel.
See loader.go comments for orientation.

This is what happens when you use start using Dmitry's new trace tool. :)

Tests:
- added test of cycles
- load/parse/typecheck of 'godoc' is ~2.5x faster
- race detector finds no errors.

Change-Id: Icb5712c7825002342baf471b216252cecd9149d6
Reviewed-on: https://go-review.googlesource.com/1582
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-01-14 16:10:20 +00:00
Alan Donovan 47f2109c64 go/ssa: slight simplification to setCallFunc
Change-Id: I6b8cc35f779910ebab3db9994bb17456a6df4b94
Reviewed-on: https://go-review.googlesource.com/2742
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-01-13 17:32:58 +00:00
Peter Collingbourne d3e7567302 go/loader: introduce PackageCreated hook
PackageCreated is a hook called when a types.Package
is created but before it has been populated.

The package's import Path() and Scope() are defined,
but not its Name() since no package declaration has
been seen yet.

Clients may use this to insert synthetic items into
the package scope, for example.

Change-Id: I210a0c4c766f03f715f03f26d5cd765f15f56e04
Reviewed-on: https://go-review.googlesource.com/2138
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-01-13 15:48:33 +00:00
Peter Collingbourne 4f8578d2c0 astutil: move to go/ast/astutil
Change-Id: I9a45bfc07613eb2210081d306d71f0a4d152eda5
Reviewed-on: https://go-review.googlesource.com/2592
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-01-13 15:47:47 +00:00
Alan Donovan 86040b7505 go/types: close scope for each "select" case after its body
Classic Go pitfall: "defer" in a loop does not do what you might expect.

+ test case

Fixes issue 9570
Fixes issue 9569

Change-Id: Iec05420872ef71190083a7192f76c92f54f4a2a1
Reviewed-on: https://go-review.googlesource.com/2655
Reviewed-by: Robert Griesemer <gri@golang.org>
2015-01-12 18:04:11 +00:00
Dmitri Shuralyov c10e262955 go/vcs: fix bug in remote package discovery
The parser was assuming it would find <body> or </head>.
If the entire response is just <meta> tags, it finds EOF and
treats that as an error. It's not.

This is the same change as in https://golang.org/cl/68520044.

Fixes #9556.

Change-Id: If51ed36e7364c15788311039caf8323eb5fe9a6c
Reviewed-on: https://go-review.googlesource.com/2650
Reviewed-by: Minux Ma <minux@golang.org>
2015-01-10 08:10:09 +00:00
Robert Griesemer 4fbaee50fd go/types: revert gofmt -s change to permit building with 1.3
Per request from dsymonds.

Change-Id: I1f034859880df0d8313d67da90457ac56459ed76
Reviewed-on: https://go-review.googlesource.com/2562
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: David Symonds <dsymonds@golang.org>
2015-01-08 20:27:41 +00:00
Robert Griesemer 44ee65f545 go/types: don't allow f()... if f() is multi-valued
Also: Better position for error messages related to wrong use of ... .

Fixes #9473.

Change-Id: I90565f51a42897b7292f651a84a23611a5d8f359
Reviewed-on: https://go-review.googlesource.com/2390
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-01-08 18:10:12 +00:00
Robert Griesemer 4ad370efaa go/types: avoid follow-up error if composite literal type is unknown
Fixes #9182.

Change-Id: I7090e600e9981131db7f323e7ce6419017e95458
Reviewed-on: https://go-review.googlesource.com/2481
Reviewed-by: Alan Donovan <adonovan@google.com>
2015-01-08 17:00:29 +00:00
Peter Collingbourne bcd5efa0ef go/types: make import check optional via a flag in types.Config
It is sometimes useful for API clients to be able to disable the unused
import check, although for good reason this should not be exposed as part of
a user-facing interface. There are at least two use cases that I am aware of:

1) It allows for automated test case reduction tools such as delta or C-Reduce
   to be more easily applied to type checker input. Disabling the check
   makes it possible for the tool to identify and remove code that depends
   on imported packages without any specific knowledge of Go, as the import
   need not be removed simultaneously with the code.

2) Interactive tools (such as REPLs) that may have previously received a
   list of imports and subsequently receive a line of code that may use any
   number of these imports. It is simpler for such tools to import all the
   packages in its list than to try to identify the correct set of imports.

Change-Id: I00091a4e5c8e1bd664efd82a636f255eaaa5a2db
Reviewed-on: https://go-review.googlesource.com/2136
Reviewed-by: Robert Griesemer <gri@golang.org>
2014-12-31 00:06:02 +00:00
Peter Collingbourne 6370cd3a8e go/types: modify Eval, EvalNode to return a TypeAndValue
The new interface makes the functions more useful by allowing clients to
check the various properties that TypeAndValue provides.

Change-Id: I8b41a27316081bea24a18ffe6fa1812e809d6f67
Reviewed-on: https://go-review.googlesource.com/2134
Reviewed-by: Robert Griesemer <gri@golang.org>
2014-12-30 17:21:45 +00:00
Alan Donovan 538acf1c92 go/ssa: add position info to all Load/Store instructions
Was originally https://codereview.appspot.com/92880043/ by Richard Musiol.

Change-Id: If0b22cf962b94ef44edbac28a5e5af4acb950991
Reviewed-on: https://go-review.googlesource.com/2174
Reviewed-by: Robert Griesemer <gri@golang.org>
2014-12-29 23:03:32 +00:00
Alan Donovan 4f13714aca astutil: add Unparen utility, eliminating 7 copies.
Change-Id: I824328c275bd6198a57edd64bf72cb2cf0490a68
Reviewed-on: https://go-review.googlesource.com/2172
Reviewed-by: Chris Manghane <cmang@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
2014-12-29 22:24:57 +00:00
Alan Donovan 43a6897047 go/ssa: simplify make([]T, len, k) to new([k]T)[:len] for constant k
+ test.

Change-Id: I0255e38a0f95af95a32dc1d9cf18b26db85af36f
Reviewed-on: https://go-review.googlesource.com/1519
Reviewed-by: Robert Griesemer <gri@golang.org>
2014-12-29 21:06:17 +00:00
Alan Donovan 8bc439de18 go/ssa: canonicalize receiver types to avoid creating duplicate thunk functions
+ Tests:
  Extend function name uniqueness check to exported wrappers.
  Check that expected synthetic functions are created, reachable, and not duplicated.

Change-Id: I0e87ebb2712e33e1f49da3fa9a9dde0085bf3850
Reviewed-on: https://go-review.googlesource.com/2013
Reviewed-by: Robert Griesemer <gri@golang.org>
2014-12-29 17:53:02 +00:00
Alan Donovan 761c80fdf4 go/ssa: canonicalize receiver types to avoid creating duplicate thunk functions
+ test

Change-Id: Ie37835577ffcdd764cf6a0b611e02f04386755cf
Reviewed-on: https://go-review.googlesource.com/1580
Reviewed-by: Robert Griesemer <gri@golang.org>
2014-12-29 17:50:45 +00:00
Alan Donovan 4b1d99f7f3 go/ssa/interp: delete SSA bodies from standalone functions in "reflect"
...like we do for "runtime" functions, so that they fail informatively
if executed.  They all need intrinsics, but only some are yet defined.

Also:
- added test for issue 9462
- "BUG" in test output is now a failure in all tests (not just $GOROOT tests)
- added intrinsic for reflect.SliceOf
- show dynamic type of panic value

Fixes issue 9462

Change-Id: I3a504c7faeed81e922fedc7dd59222717f3a7e95
Reviewed-on: https://go-review.googlesource.com/2145
Reviewed-by: Robert Griesemer <gri@golang.org>
2014-12-29 17:35:17 +00:00
Emil Hessman ca3901c3d8 all: address vet reports
Fixes various problems reported by go vet.

Change-Id: I12a6fdba8f911b21805d8e42903f8f6a5033790a
Reviewed-on: https://go-review.googlesource.com/2163
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2014-12-29 06:08:34 +00:00
David Symonds 24257c8cd2 tools: add import comments.
Change-Id: Idda6e64580432cb9a731e4ebf4005ee4ceb4202d
Reviewed-on: https://go-review.googlesource.com/1244
Reviewed-by: Andrew Gerrand <adg@golang.org>
2014-12-09 22:42:16 +00:00
Andrew Gerrand a652b8bab4 x/tools/go/vcs: support go.googlecode.com paths
Also fix a bug in CreateAtRev, which was doing something hg-specific.

LGTM=cmang
R=cmang
CC=golang-codereviews
https://golang.org/cl/180540043
2014-12-04 10:43:23 +11:00
Robert Griesemer cc6170934b go/exact: handle unknowns consistently
Fixes golang/go#9147.

LGTM=adonovan
R=adonovan
CC=golang-codereviews
https://golang.org/cl/180110043
2014-11-21 13:08:59 -08:00
Alan Donovan a9651d6ad7 cmd/callgraph: add -algo=static and -algo=cha options.
"static" ignores dynamic calls altogether.

"cha" uses Class Hierarchy Analysis, which assumes that a
dynamic call may dispatch to any func or method that satisfies
the type.

Both these algorithms can work on partial programs,
e.g. libraries without a main function or tests.

(This feature was requested after my talk last night.)

+ Tests.

LGTM=sameer
R=sameer, minux
CC=golang-codereviews, gri
https://golang.org/cl/176780043
2014-11-21 11:07:56 -05:00
Alan Donovan ce7df396da go/pointer: fix two crashes caused by 'print()'.
+ Test.

LGTM=crawshaw
R=crawshaw
CC=golang-codereviews
https://golang.org/cl/173540043
2014-11-20 13:33:20 -05:00
Alan Donovan 0088b7ecd7 go/types: don't panic if DefaultImport==nil, until we actually use it.
LGTM=gri
R=gri
CC=golang-codereviews
https://golang.org/cl/178860044
2014-11-17 15:24:12 -05:00