Polish out support for reals and strings. (#2593)

Reals were mostly handled, but this PR adds storage of them. It also switches a little towards the FloatingPointType semantic from TokenizedBuffer.

While real literals like `1.0` were handled, the type literals were not. This just adds `f64`, similar to how I also only support `i32`.

The String type literal wasn't used, so I've added support in lexer and parser. Per discussion with @zygoloid String might be renamed based on the newer type literal plan, but it's still String in explorer and the design, so this is just consistent.

The builtin_types.carbon tests the three basic types that are there right now. The test is added to both parser and semantics so that it's clear what the state is in both stages.
This commit is contained in:
Jon Ross-Perkins
2023-02-13 08:04:49 -08:00
committed by GitHub
parent 98041d70c2
commit 22d7cd19ed
40 changed files with 482 additions and 189 deletions
+6 -3
View File
@@ -10,6 +10,8 @@
// CHECK:STDOUT: ]
// CHECK:STDOUT: integer_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: real_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: strings: [
// CHECK:STDOUT: Foo,
// CHECK:STDOUT: ]
@@ -18,17 +20,18 @@
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node1, type: node1},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node2, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node3, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable0},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node4},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node4, arg1: block0},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node5},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node5, arg1: block0},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node4,
// CHECK:STDOUT: node5,
// CHECK:STDOUT: node6,
// CHECK:STDOUT: node7,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
+10 -7
View File
@@ -12,6 +12,8 @@
// CHECK:STDOUT: ]
// CHECK:STDOUT: integer_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: real_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: strings: [
// CHECK:STDOUT: Foo,
// CHECK:STDOUT: Bar,
@@ -22,21 +24,21 @@
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node1, type: node1},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node2, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node3, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable0},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node4},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node4, arg1: block0},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node5},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node5, arg1: block0},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable1},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node7},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node7, arg1: block0},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node8},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node8, arg1: block0},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable2},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node10},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node10, arg1: block0},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node11},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node11, arg1: block0},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node4,
// CHECK:STDOUT: node5,
// CHECK:STDOUT: node6,
// CHECK:STDOUT: node7,
@@ -45,6 +47,7 @@
// CHECK:STDOUT: node10,
// CHECK:STDOUT: node11,
// CHECK:STDOUT: node12,
// CHECK:STDOUT: node13,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
+10 -7
View File
@@ -10,6 +10,8 @@
// CHECK:STDOUT: ]
// CHECK:STDOUT: integer_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: real_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: strings: [
// CHECK:STDOUT: a,
// CHECK:STDOUT: Foo,
@@ -19,26 +21,27 @@
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node1, type: node1},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node2, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node3, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
// CHECK:STDOUT: {kind: VarStorage, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node4, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node5, type: node2},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable0},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node6},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node6, arg1: block0},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node7},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node7, arg1: block0},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node4,
// CHECK:STDOUT: node5,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node5,
// CHECK:STDOUT: node6,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node6,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node7,
// CHECK:STDOUT: node8,
// CHECK:STDOUT: node9,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
@@ -10,6 +10,8 @@
// CHECK:STDOUT: ]
// CHECK:STDOUT: integer_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: real_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: strings: [
// CHECK:STDOUT: a,
// CHECK:STDOUT: Foo,
@@ -19,26 +21,27 @@
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node1, type: node1},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node2, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node3, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
// CHECK:STDOUT: {kind: VarStorage, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node4, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node5, type: node2},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable0},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node6},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node6, arg1: block0},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node7},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node7, arg1: block0},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node4,
// CHECK:STDOUT: node5,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node5,
// CHECK:STDOUT: node6,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node6,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node7,
// CHECK:STDOUT: node8,
// CHECK:STDOUT: node9,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
+14 -11
View File
@@ -10,6 +10,8 @@
// CHECK:STDOUT: ]
// CHECK:STDOUT: integer_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: real_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: strings: [
// CHECK:STDOUT: a,
// CHECK:STDOUT: b,
@@ -20,31 +22,32 @@
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node1, type: node1},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node2, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node3, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
// CHECK:STDOUT: {kind: VarStorage, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node4, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node5, type: node2},
// CHECK:STDOUT: {kind: VarStorage, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node6, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node7, type: node2},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable0},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node8},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node8, arg1: block0},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node9},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node9, arg1: block0},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node4,
// CHECK:STDOUT: node5,
// CHECK:STDOUT: node6,
// CHECK:STDOUT: node7,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node5,
// CHECK:STDOUT: node7,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node8,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node6,
// CHECK:STDOUT: node8,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node9,
// CHECK:STDOUT: node10,
// CHECK:STDOUT: node11,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]
+14 -11
View File
@@ -10,6 +10,8 @@
// CHECK:STDOUT: ]
// CHECK:STDOUT: integer_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: real_literals: [
// CHECK:STDOUT: ]
// CHECK:STDOUT: strings: [
// CHECK:STDOUT: a,
// CHECK:STDOUT: b,
@@ -20,31 +22,32 @@
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node1, type: node1},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node2, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node3, type: node0},
// CHECK:STDOUT: {kind: CrossReference, arg0: ir0, arg1: node4, type: node0},
// CHECK:STDOUT: {kind: VarStorage, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node4, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node5, type: node2},
// CHECK:STDOUT: {kind: VarStorage, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node6, type: node2},
// CHECK:STDOUT: {kind: BindName, arg0: str1, arg1: node7, type: node2},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: callable0},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node8},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node8, arg1: block0},
// CHECK:STDOUT: {kind: BindName, arg0: str2, arg1: node9},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node9, arg1: block0},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node4,
// CHECK:STDOUT: node5,
// CHECK:STDOUT: node6,
// CHECK:STDOUT: node7,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node5,
// CHECK:STDOUT: node7,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node8,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node6,
// CHECK:STDOUT: node8,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node9,
// CHECK:STDOUT: node10,
// CHECK:STDOUT: node11,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]