1. 25 Jul, 2013 1 commit
    • Kevin Klues's avatar
      cmd/cgo: Fix issue with cgo cdefs · f7dfeea9
      Kevin Klues authored
      The problem is that the cdecl() function in cmd/cgo/godefs.go isn't
      properly translating the Go array type to a C array type when an
      asterisk follows the [] in the array type declaration (it is perfectly
      legal to put the asterisk on either side of the [] in go syntax,
      depending on how you set up your pointers).
      
      That said, the cdefs tool is only designed to translate from Go types
      generated using the cgo *godefs* tool -- where the godefs tool is
      designed to translate gcc-style C types into Go types. In essence, the
      cdefs tool translates from gcc-style C types to Go types (via the godefs
      tool), then back to kenc-style C types. Because of this, cdefs does not
      need to know how to translate arbitraty Go types into C, just the ones
      produced by godefs.
      
      The problem is that during this translation process, the logic is
      slightly wrong when going from (e.g.):
      
      char *array[10];
      to:
      array [10]*int8;
      back to:
      int8 *array[10];
      
      In the current implementation of cdecl(), the translation from the Go
      type declaration back to the kenc-style declaration looks for Go
      types of the form:
      
      name *[]type;
      rather than the actual generated Go type declaration of:
      name []*type;
      
      Both are valid Go syntax, with slightly different semantics, but the
      latter is the only one that can ever be generated by the godefs tools.
      (The semantics of the former are not directly expressible in a
      single C statement -- you would have to have to first typedef the array
      type, then declare a pointer to that typedef'd type in a separate
      statement).
      
      This commit changes the logic of cdecl() to look properly for, and
      translate, Go type declarations of the form:
      name []*type;
      
      Additionally, the original implementation only allowed for a single
      asterisk and a single sized aray (i.e. only a single level of pointer
      indirection, and only one set of []) on the type, whereas the patched
      version allows for an arbitrary number of both.
      
      Tests are included in misc/cgo/testcdefs and the all.bash script has been
      updated to account for these.
      
      R=golang-dev, bradfitz, dave, iant
      CC=golang-dev
      https://golang.org/cl/11377043
      f7dfeea9
  2. 24 Jul, 2013 14 commits
  3. 23 Jul, 2013 9 commits
  4. 22 Jul, 2013 11 commits
  5. 20 Jul, 2013 4 commits
  6. 19 Jul, 2013 1 commit