Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/cgo: do not look at error message text #6596

Closed
rsc opened this issue Oct 16, 2013 · 3 comments

Comments

@rsc
Copy link
Contributor

commented Oct 16, 2013

cgo currently looks at the error message text from a trial compilation to deduce whether
a name C.foo refers to a function, type, variable, or constant. We can and should change
cgo to generate programs such that only the presence or absence of an error on a
particular line is needed. This will make cgo much less dependent on the compiler
details.
@rsc

This comment has been minimized.

Copy link
Contributor Author

commented Oct 18, 2013

Comment 1:

Status changed to Started.

@rsc

This comment has been minimized.

Copy link
Contributor Author

commented Oct 18, 2013

Comment 2:

This issue was closed by revision 06ad3b2.

Status changed to Fixed.

@adg

This comment has been minimized.

Copy link
Contributor

commented Nov 1, 2013

Comment 3:

This issue was closed by revision 2acdaa9fe432.

@rsc rsc added fixed labels Nov 1, 2013

@rsc rsc added this to the Go1.3 milestone Apr 14, 2015

@rsc rsc removed the go1.3 label Apr 14, 2015

adg added a commit that referenced this issue May 11, 2015
[release-branch.go1.2] cmd/cgo: stop using compiler error message tex…
…t to analyze C names

««« CL 15070043 / 90a628ac54ed
cmd/cgo: stop using compiler error message text to analyze C names

The old approach to determining whether "name" was a type, constant,
or expression was to compile the C program

        name;

and scan the errors and warnings generated by the compiler.
This requires looking for specific substrings in the errors and warnings,
which ties the implementation to specific compiler versions.
As compilers change their errors or drop warnings, cgo breaks.
This happens slowly but it does happen.
Clang in particular (now required on OS X) has a significant churn rate.

The new approach compiles a slightly more complex program
that is either valid C or not valid C depending on what kind of
thing "name" is. It uses only the presence or absence of an error
message on a particular line, not the error text itself. The program is:

        // error if and only if name is undeclared
        void f1(void) { typeof(name) *x; }

        // error if and only if name is not a type
        void f2(void) { name *x; }

        // error if and only if name is not an integer constant
        void f3(void) { enum { x = (name)*1 }; }

I had not been planning to do this until Go 1.3, because it is a
non-trivial change, but it fixes a real Xcode 5 problem in Go 1.2,
and the new code is easier to understand than the old code.
It should be significantly more robust.

Fixes #6596.
Fixes #6612.

R=golang-dev, r, james, iant
CC=golang-dev
https://golang.org/cl/15070043
»»»

R=golang-dev
CC=golang-dev
https://golang.org/cl/20060044

@golang golang locked and limited conversation to collaborators Jun 25, 2016

This issue was closed.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
3 participants
You can’t perform that action at this time.