value.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. // Copyright 2022 The Gc Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package gc // modernc.org/gc/v3
  5. import (
  6. "go/constant"
  7. "math"
  8. )
  9. var (
  10. _ Expression = (*BasicLitNode)(nil)
  11. _ Expression = (*BinaryExpressionNode)(nil)
  12. _ Expression = (*CompositeLitNode)(nil)
  13. _ Expression = (*ConversionNode)(nil)
  14. _ Expression = (*FunctionLitNode)(nil)
  15. _ Expression = (*KeyedElementNode)(nil)
  16. _ Expression = (*LiteralValueNode)(nil)
  17. _ Expression = (*MethodExprNode)(nil)
  18. _ Expression = (*OperandNameNode)(nil)
  19. _ Expression = (*OperandNode)(nil)
  20. _ Expression = (*OperandQualifiedNameNode)(nil)
  21. _ Expression = (*ParenthesizedExpressionNode)(nil)
  22. _ Expression = (*PrimaryExprNode)(nil)
  23. _ Expression = (*UnaryExprNode)(nil)
  24. _ Expression = (*ValueExpression)(nil)
  25. falseVal = constant.MakeBool(false)
  26. trueVal = constant.MakeBool(true)
  27. unknown = constant.MakeUnknown()
  28. )
  29. func known(v constant.Value) bool { return v != nil && v.Kind() != constant.Unknown }
  30. type valueCache struct {
  31. v constant.Value
  32. }
  33. func (n *valueCache) Value() constant.Value {
  34. if n.v != nil {
  35. return n.v
  36. }
  37. return unknown
  38. }
  39. func (n *valueCache) setValue(v constant.Value) constant.Value {
  40. n.v = v
  41. return v
  42. }
  43. type valuer interface {
  44. Value() constant.Value
  45. }
  46. type Expression interface {
  47. Node
  48. checkExpr(c *ctx) Expression
  49. clone() Expression
  50. typer
  51. valuer
  52. }
  53. type ValueExpression struct {
  54. Node
  55. typeCache
  56. valueCache
  57. }
  58. func (n *ValueExpression) checkExpr(c *ctx) Expression {
  59. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  60. }
  61. func (n *ValueExpression) clone() Expression {
  62. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  63. }
  64. func (n *BasicLitNode) Type() Type {
  65. switch n.Ch() {
  66. case CHAR:
  67. return n.ctx.int32
  68. case INT:
  69. return n.ctx.untypedInt
  70. case FLOAT:
  71. return n.ctx.untypedFloat
  72. case STRING:
  73. return n.ctx.untypedString
  74. default:
  75. panic(todo("%v: %T %s %v", n.Position(), n, n.Source(false), n.Ch()))
  76. }
  77. }
  78. func (n *BasicLitNode) Value() constant.Value {
  79. return constant.MakeFromLiteral(n.Src(), n.Ch(), 0)
  80. }
  81. func (n *BasicLitNode) checkExpr(c *ctx) Expression {
  82. n.ctx = c
  83. if !known(n.Value()) {
  84. c.err(n, "invalid literal: %s", n.Source(false))
  85. }
  86. return n
  87. }
  88. func (n *BasicLitNode) clone() Expression {
  89. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  90. }
  91. func (n *OperandNameNode) Type() Type {
  92. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  93. }
  94. func (n *OperandNameNode) Value() constant.Value {
  95. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  96. }
  97. func (n *OperandNameNode) checkExpr(c *ctx) Expression {
  98. in, named := n.LexicalScope().lookup(n.Name)
  99. switch x := named.n.(type) {
  100. case *ConstSpecNode:
  101. switch in.kind {
  102. case UniverseScope:
  103. switch n.Name.Src() {
  104. case "iota":
  105. if c.iota < 0 {
  106. panic(todo("%v: %T %s", n.Position(), x, n.Source(false)))
  107. }
  108. r := &ValueExpression{Node: x}
  109. r.t = c.untypedInt
  110. r.v = constant.MakeInt64(c.iota)
  111. return r
  112. default:
  113. panic(todo("%v: %T %s", n.Position(), x, n.Source(false)))
  114. }
  115. default:
  116. return x.Expression
  117. }
  118. default:
  119. panic(todo("%v: %T %s", n.Position(), x, n.Source(false)))
  120. }
  121. }
  122. func (n *OperandNameNode) clone() Expression {
  123. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  124. }
  125. func (n *ParenthesizedExpressionNode) Type() Type {
  126. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  127. }
  128. func (n *ParenthesizedExpressionNode) Value() constant.Value {
  129. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  130. }
  131. func (n *ParenthesizedExpressionNode) checkExpr(c *ctx) Expression {
  132. return n.Expression.checkExpr(c)
  133. }
  134. func (n *ParenthesizedExpressionNode) clone() Expression {
  135. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  136. }
  137. func (n *LiteralValueNode) Type() Type {
  138. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  139. }
  140. func (n *LiteralValueNode) Value() constant.Value {
  141. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  142. }
  143. func (n *LiteralValueNode) checkExpr(c *ctx) Expression {
  144. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  145. }
  146. func (n *LiteralValueNode) clone() Expression {
  147. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  148. }
  149. func (n *KeyedElementNode) Type() Type {
  150. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  151. }
  152. func (n *KeyedElementNode) Value() constant.Value {
  153. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  154. }
  155. func (n *KeyedElementNode) checkExpr(c *ctx) Expression {
  156. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  157. }
  158. func (n *KeyedElementNode) clone() Expression {
  159. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  160. }
  161. func (n *CompositeLitNode) Type() Type {
  162. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  163. }
  164. func (n *CompositeLitNode) Value() constant.Value {
  165. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  166. }
  167. func (n *CompositeLitNode) checkExpr(c *ctx) Expression {
  168. if n == nil {
  169. return nil
  170. }
  171. if !n.enter(c, n) {
  172. return n
  173. }
  174. t := n.setType(c.checkType(n.LiteralType))
  175. n.LiteralValue.check(c, t)
  176. return n
  177. }
  178. func (n *CompositeLitNode) clone() Expression {
  179. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  180. }
  181. func (n *LiteralValueNode) check(c *ctx, t Type) {
  182. if n == nil {
  183. return
  184. }
  185. switch t.Kind() {
  186. case Array:
  187. n.checkArray(c, t.(*ArrayTypeNode))
  188. default:
  189. panic(todo("%v: %T %s %v", n.Position(), n, n.Source(false), t.Kind()))
  190. }
  191. }
  192. func (n *LiteralValueNode) checkArray(c *ctx, t *ArrayTypeNode) {
  193. panic(todo("%v: %T %s %s", n.Position(), n, t, n.Source(false)))
  194. }
  195. func (n *FunctionLitNode) Type() Type {
  196. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  197. }
  198. func (n *FunctionLitNode) Value() constant.Value {
  199. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  200. }
  201. func (n *FunctionLitNode) checkExpr(c *ctx) Expression {
  202. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  203. }
  204. func (n *FunctionLitNode) clone() Expression {
  205. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  206. }
  207. func (n *OperandNode) Type() Type {
  208. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  209. }
  210. func (n *OperandNode) Value() constant.Value {
  211. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  212. }
  213. func (n *OperandNode) checkExpr(c *ctx) Expression {
  214. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  215. }
  216. func (n *OperandNode) clone() Expression {
  217. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  218. }
  219. func (n *OperandQualifiedNameNode) Type() Type {
  220. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  221. }
  222. func (n *OperandQualifiedNameNode) Value() constant.Value {
  223. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  224. }
  225. func (n *OperandQualifiedNameNode) checkExpr(c *ctx) Expression {
  226. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  227. }
  228. func (n *OperandQualifiedNameNode) clone() Expression {
  229. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  230. }
  231. func (n *ConversionNode) Type() Type {
  232. return n.TypeNode
  233. }
  234. func (n *ConversionNode) checkExpr(c *ctx) Expression {
  235. t := n.TypeNode.check(c)
  236. n.Expression = n.Expression.checkExpr(c)
  237. v := n.Expression.Value()
  238. n.v = c.convertValue(n.Expression, v, t)
  239. return n
  240. }
  241. func (n *ConversionNode) clone() Expression {
  242. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  243. }
  244. func (n *MethodExprNode) Type() Type {
  245. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  246. }
  247. func (n *MethodExprNode) Value() constant.Value {
  248. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  249. }
  250. func (n *MethodExprNode) checkExpr(c *ctx) Expression {
  251. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  252. }
  253. func (n *MethodExprNode) clone() Expression {
  254. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  255. }
  256. func (n *PrimaryExprNode) Type() Type {
  257. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  258. }
  259. func (n *PrimaryExprNode) Value() constant.Value {
  260. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  261. }
  262. func (n *PrimaryExprNode) checkExpr(c *ctx) Expression {
  263. switch x := n.PrimaryExpr.(type) {
  264. case *OperandNameNode:
  265. _, named := x.LexicalScope().lookup(x.Name)
  266. switch y := named.n.(type) {
  267. case *TypeDefNode:
  268. switch z := n.Postfix.(type) {
  269. case *ArgumentsNode:
  270. cnv := &ConversionNode{
  271. TypeNode: &TypeNameNode{
  272. Name: x.Name,
  273. lexicalScoper: x.lexicalScoper,
  274. },
  275. LPAREN: z.LPAREN,
  276. Expression: z.Expression,
  277. RPAREN: z.RPAREN,
  278. }
  279. return cnv.checkExpr(c)
  280. default:
  281. panic(todo("%v: %T %s", n.Position(), z, n.Source(false)))
  282. }
  283. default:
  284. panic(todo("%v: %T %s", n.Position(), y, n.Source(false)))
  285. }
  286. default:
  287. panic(todo("%v: %T %s", n.Position(), x, n.Source(false)))
  288. }
  289. n.PrimaryExpr = n.PrimaryExpr.checkExpr(c)
  290. switch x := n.Postfix.(type) {
  291. default:
  292. panic(todo("%v: %T %s", n.Position(), x, n.Source(false)))
  293. }
  294. }
  295. func (n *PrimaryExprNode) clone() Expression {
  296. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  297. }
  298. func (n *BinaryExpressionNode) checkExpr(c *ctx) (r Expression) {
  299. if n == nil {
  300. return nil
  301. }
  302. if n.typeCache.Type() != Invalid {
  303. return n
  304. }
  305. n.LHS = n.LHS.checkExpr(c)
  306. n.RHS = n.RHS.checkExpr(c)
  307. lv := n.LHS.Value()
  308. lt := n.LHS.Type()
  309. rv := n.RHS.Value()
  310. rt := n.RHS.Type()
  311. defer func() {
  312. if known(lv) && known(rv) && r != nil && !known(r.Value()) {
  313. c.err(n.Op, "operation value not determined: %v %s %v", lv, n.Op.Src(), rv)
  314. }
  315. }()
  316. switch n.Op.Ch() {
  317. case SHL, SHR:
  318. var u uint64
  319. var uOk bool
  320. n.t = lt
  321. // The right operand in a shift expression must have integer type or be an
  322. // untyped constant representable by a value of type uint.
  323. switch {
  324. case isIntegerType(rt):
  325. // ok
  326. case known(rv):
  327. if isAnyArithmeticType(rt) {
  328. rv = c.convertValue(n.RHS, rv, c.cfg.uint)
  329. if known(rv) {
  330. u, uOk = constant.Uint64Val(rv)
  331. }
  332. break
  333. }
  334. c.err(n.Op, "TODO %v", n.Op.Src())
  335. return n
  336. default:
  337. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  338. return n
  339. }
  340. // If the left operand of a non-constant shift expression is an untyped
  341. // constant, it is first implicitly converted to the type it would assume if
  342. // the shift expression were replaced by its left operand alone.
  343. switch {
  344. case known(lv) && !known(rv):
  345. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  346. // c.err(n.Op, "TODO %v", n.Op.Ch.str())
  347. // return n
  348. case known(lv) && known(rv):
  349. if !uOk {
  350. panic(todo(""))
  351. }
  352. n.t = lt
  353. n.v = constant.Shift(lv, n.Op.Ch(), uint(u))
  354. default:
  355. trc("", known(lv), known(rv), u, uOk)
  356. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  357. // n.t = lt
  358. // n.v = constant.BinaryOp(lv, n.Op.Ch(), rv)
  359. }
  360. case ADD, SUB, MUL, QUO, REM:
  361. if !isAnyArithmeticType(lt) || !isAnyArithmeticType(rt) {
  362. c.err(n.Op, "TODO %v %v", lt, rt)
  363. break
  364. }
  365. // For other binary operators, the operand types must be identical unless the
  366. // operation involves shifts or untyped constants.
  367. //
  368. // Except for shift operations, if one operand is an untyped constant and the
  369. // other operand is not, the constant is implicitly converted to the type of
  370. // the other operand.
  371. switch {
  372. case isAnyUntypedType(lt) && isAnyUntypedType(rt):
  373. n.v = constant.BinaryOp(lv, n.Op.Ch(), rv)
  374. switch n.v.Kind() {
  375. case constant.Int:
  376. n.t = c.untypedInt
  377. case constant.Float:
  378. n.t = c.untypedFloat
  379. default:
  380. c.err(n.Op, "TODO %v %v %q %v %v -> %v %v", lv, lt, n.Op.Src(), rv, rt, n.v, n.v.Kind())
  381. }
  382. case isAnyUntypedType(lt) && !isAnyUntypedType(rt):
  383. c.err(n.Op, "TODO %v %v %q %v %v", lv, lt, n.Op.Src(), rv, rt)
  384. case !isAnyUntypedType(lt) && isAnyUntypedType(rt):
  385. c.err(n.Op, "TODO %v %v %q %v %v", lv, lt, n.Op.Src(), rv, rt)
  386. default: // case !isAnyUntypedType(lt) && !isAnyUntypedType(rt):
  387. c.err(n.Op, "TODO %v %v %q %v %v", lv, lt, n.Op.Src(), rv, rt)
  388. }
  389. default:
  390. c.err(n.Op, "TODO %v %v %q %v %v", lv, lt, n.Op.Src(), rv, rt)
  391. }
  392. return n
  393. }
  394. func (n *BinaryExpressionNode) clone() Expression {
  395. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  396. }
  397. func (n *UnaryExprNode) checkExpr(c *ctx) Expression {
  398. if n == nil {
  399. return nil
  400. }
  401. if n.typeCache.Type() != Invalid {
  402. return n
  403. }
  404. n.UnaryExpr = n.UnaryExpr.checkExpr(c)
  405. v := n.UnaryExpr.Value()
  406. t := n.UnaryExpr.Type()
  407. switch n.Op.Ch() {
  408. default:
  409. trc("", v, t)
  410. panic(todo("%v: %T %s", n.Op.Position(), n, n.Source(false)))
  411. }
  412. }
  413. func (n *UnaryExprNode) clone() Expression {
  414. panic(todo("%v: %T %s", n.Position(), n, n.Source(false)))
  415. }
  416. func (c *ctx) convertValue(n Node, v constant.Value, to Type) (r constant.Value) {
  417. if !known(v) {
  418. return unknown
  419. }
  420. switch to.Kind() {
  421. case
  422. Complex128,
  423. Complex64,
  424. Function,
  425. Interface,
  426. Map,
  427. Pointer,
  428. Slice,
  429. String,
  430. Struct,
  431. Tuple,
  432. UnsafePointer,
  433. UntypedBool,
  434. UntypedComplex,
  435. UntypedFloat,
  436. UntypedInt,
  437. UntypedNil,
  438. UntypedRune,
  439. UntypedString:
  440. c.err(n, "TODO %v -> %v", v, to)
  441. case Int:
  442. w := constant.ToInt(v)
  443. if !known(w) {
  444. c.err(n, "cannot convert %s to %s", v, to)
  445. return unknown
  446. }
  447. i64, ok := constant.Int64Val(w)
  448. if !ok {
  449. c.err(n, "value %s overflows %s", v, to)
  450. return unknown
  451. }
  452. switch c.cfg.goarch {
  453. case "386", "arm":
  454. if i64 < math.MinInt32 || i64 > math.MaxInt32 {
  455. c.err(n, "value %s overflows %s", v, to)
  456. return unknown
  457. }
  458. }
  459. return w
  460. case Int8:
  461. w := constant.ToInt(v)
  462. if !known(w) {
  463. c.err(n, "cannot convert %s to %s", v, to)
  464. return unknown
  465. }
  466. i64, ok := constant.Int64Val(w)
  467. if !ok {
  468. c.err(n, "value %s overflows %s", v, to)
  469. return unknown
  470. }
  471. if i64 < math.MinInt8 || i64 > math.MaxInt8 {
  472. c.err(n, "value %s overflows %s", v, to)
  473. return unknown
  474. }
  475. return w
  476. case Int16:
  477. w := constant.ToInt(v)
  478. if !known(w) {
  479. c.err(n, "cannot convert %s to %s", v, to)
  480. return unknown
  481. }
  482. i64, ok := constant.Int64Val(w)
  483. if !ok {
  484. c.err(n, "value %s overflows %s", v, to)
  485. return unknown
  486. }
  487. if i64 < math.MinInt16 || i64 > math.MaxInt16 {
  488. c.err(n, "value %s overflows %s", v, to)
  489. return unknown
  490. }
  491. return w
  492. case Int32:
  493. w := constant.ToInt(v)
  494. if !known(w) {
  495. c.err(n, "cannot convert %s to %s", v, to)
  496. return unknown
  497. }
  498. i64, ok := constant.Int64Val(w)
  499. if !ok {
  500. c.err(n, "value %s overflows %s", v, to)
  501. return unknown
  502. }
  503. if i64 < math.MinInt32 || i64 > math.MaxInt32 {
  504. c.err(n, "value %s overflows %s", v, to)
  505. return unknown
  506. }
  507. return w
  508. case Int64:
  509. w := constant.ToInt(v)
  510. if !known(w) {
  511. c.err(n, "cannot convert %s to %s", v, to)
  512. return unknown
  513. }
  514. if _, ok := constant.Int64Val(w); !ok {
  515. c.err(n, "value %s overflows %s", v, to)
  516. return unknown
  517. }
  518. return w
  519. case Uint, Uintptr:
  520. w := constant.ToInt(v)
  521. if !known(w) {
  522. c.err(n, "cannot convert %s to %s", v, to)
  523. return unknown
  524. }
  525. u64, ok := constant.Uint64Val(w)
  526. if !ok {
  527. c.err(n, "value %s overflows %s", v, to)
  528. return unknown
  529. }
  530. switch c.cfg.goarch {
  531. case "386", "arm":
  532. if u64 > math.MaxUint32 {
  533. c.err(n, "value %s overflows %s", v, to)
  534. return unknown
  535. }
  536. }
  537. return w
  538. case Uint8:
  539. w := constant.ToInt(v)
  540. if !known(w) {
  541. c.err(n, "cannot convert %s to %s", v, to)
  542. return unknown
  543. }
  544. u64, ok := constant.Uint64Val(w)
  545. if !ok {
  546. c.err(n, "value %s overflows %s", v, to)
  547. return unknown
  548. }
  549. if u64 > math.MaxUint8 {
  550. c.err(n, "value %s overflows %s", v, to)
  551. return unknown
  552. }
  553. return w
  554. case Uint16:
  555. w := constant.ToInt(v)
  556. if !known(w) {
  557. c.err(n, "cannot convert %s to %s", v, to)
  558. return unknown
  559. }
  560. u64, ok := constant.Uint64Val(w)
  561. if !ok {
  562. c.err(n, "value %s overflows %s", v, to)
  563. return unknown
  564. }
  565. if u64 > math.MaxUint16 {
  566. c.err(n, "value %s overflows %s", v, to)
  567. return unknown
  568. }
  569. return w
  570. case Uint32:
  571. w := constant.ToInt(v)
  572. if !known(w) {
  573. c.err(n, "cannot convert %s to %s", v, to)
  574. return unknown
  575. }
  576. u64, ok := constant.Uint64Val(w)
  577. if !ok {
  578. c.err(n, "value %s overflows %s", v, to)
  579. return unknown
  580. }
  581. if u64 > math.MaxUint32 {
  582. c.err(n, "value %s overflows %s", v, to)
  583. return unknown
  584. }
  585. return w
  586. case Uint64:
  587. w := constant.ToInt(v)
  588. if !known(w) {
  589. c.err(n, "cannot convert %s to %s", v, to)
  590. return unknown
  591. }
  592. if _, ok := constant.Uint64Val(w); !ok {
  593. c.err(n, "value %s overflows %s", v, to)
  594. return unknown
  595. }
  596. return w
  597. case Float32, Float64:
  598. return constant.ToFloat(v)
  599. case Bool:
  600. if v.Kind() == constant.Bool {
  601. return v
  602. }
  603. }
  604. return unknown
  605. }