Skip to content

Commit

Permalink
debug/dwarf: correct name for clang-generated complex type
Browse files Browse the repository at this point in the history
Fixes golang#8694.

LGTM=iant
R=iant
CC=golang-codereviews
https://golang.org/cl/143570043
  • Loading branch information
rsc authored and wheatman committed Jul 6, 2018
1 parent 8d7f7e0 commit e763292
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 0 deletions.
1 change: 1 addition & 0 deletions misc/cgo/test/cgo_test.go
Expand Up @@ -57,5 +57,6 @@ func Test7560(t *testing.T) { test7560(t) }
func Test5242(t *testing.T) { test5242(t) }
func Test8092(t *testing.T) { test8092(t) }
func Test7978(t *testing.T) { test7978(t) }
func Test8694(t *testing.T) { test8694(t) }

func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
32 changes: 32 additions & 0 deletions misc/cgo/test/issue8694.go
@@ -0,0 +1,32 @@
// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package cgotest

/*
#include <complex.h>
complex float complexFloatSquared(complex float a) { return a*a; }
complex double complexDoubleSquared(complex double a) { return a*a; }
*/
import "C"

import "testing"

func test8694(t *testing.T) {
// Really just testing that this compiles, but check answer anyway.
x := complex64(2 + 3i)
x2 := x * x
cx2 := C.complexFloatSquared(x)
if cx2 != x2 {
t.Errorf("C.complexFloatSquared(%v) = %v, want %v", x, cx2, x2)
}

y := complex128(2 + 3i)
y2 := y * y
cy2 := C.complexDoubleSquared(y)
if cy2 != y2 {
t.Errorf("C.complexDoubleSquared(%v) = %v, want %v", y, cy2, y2)
}
}
11 changes: 11 additions & 0 deletions src/debug/dwarf/type.go
Expand Up @@ -431,6 +431,17 @@ func (d *Data) readType(name string, r typeReader, off Offset, typeCache map[Off
typ = new(BoolType)
case encComplexFloat:
typ = new(ComplexType)
if name == "complex" {
// clang writes out 'complex' instead of 'complex float' or 'complex double'.
// clang also writes out a byte size that we can use to distinguish.
// See issue 8694.
switch byteSize, _ := e.Val(AttrByteSize).(int64); byteSize {
case 8:
name = "complex float"
case 16:
name = "complex double"
}
}
case encFloat:
typ = new(FloatType)
case encSigned:
Expand Down

0 comments on commit e763292

Please sign in to comment.