Files
carbon-lang/explorer/fuzzing/fuzzer_corpus/d1ca518b60ba67635582c9e1f7dca5cf228a8eda
T
Richard Smith 4fa71e32f5 Add support for most kinds of declarations to be declared and used as namespace members (#2575)
Support for global variables is still missing; they're a bit more tricky because they use a pattern to introduce their name.

Prior to this change, explorer heavily relied on name comparisons to determine whether two declarations declare the same entity. Some of those instances are fixed in this PR, but more remain to be fixed, and some TODOs are added for some harder-to-fix instances.
2023-02-08 13:21:15 -08:00

998 lines
24 KiB
Plaintext

compilation_unit {
package_statement {
package_name: "ExplorerTest"
}
is_api: true
declarations {
interface {
name {
name: "Number"
}
members {
function {
name {
name: "Zero"
}
param_pattern {
}
return_term {
kind: Expression
type {
identifier {
name: "Self"
}
}
}
}
}
members {
function {
name {
name: "Add"
}
self_pattern {
binding_pattern {
name: "self"
type {
expression_pattern {
expression {
identifier {
name: "Self"
}
}
}
}
}
}
param_pattern {
fields {
binding_pattern {
name: "other"
type {
expression_pattern {
expression {
identifier {
name: "Self"
}
}
}
}
}
}
}
return_term {
kind: Expression
type {
identifier {
name: "Self"
}
}
}
}
}
}
}
declarations {
class_declaration {
name {
name: "Point"
}
members {
variable {
binding {
name: "x"
type {
expression_pattern {
expression {
identifier {
name: "T"
}
}
}
}
}
}
}
members {
variable {
binding {
name: "y"
type {
expression_pattern {
expression {
identifier {
name: "T"
}
}
}
}
}
}
}
type_params {
fields {
generic_binding {
name: "T"
type {
identifier {
name: "Number"
}
}
}
}
}
}
}
declarations {
impl {
kind: ExternalImpl
impl_type {
int_type_literal {
}
}
interface {
identifier {
name: "Number"
}
}
members {
function {
name {
name: "Zero"
}
param_pattern {
}
return_term {
kind: Expression
type {
int_type_literal {
}
}
}
body {
statements {
return_expression_statement {
expression {
int_literal {
value: 0
}
}
}
}
}
}
}
members {
function {
name {
name: "Add"
}
self_pattern {
binding_pattern {
name: "self"
type {
expression_pattern {
expression {
int_type_literal {
}
}
}
}
}
}
param_pattern {
fields {
binding_pattern {
name: "other"
type {
expression_pattern {
expression {
int_type_literal {
}
}
}
}
}
}
}
return_term {
kind: Expression
type {
int_type_literal {
}
}
}
body {
statements {
return_expression_statement {
expression {
operator {
op: Add
arguments {
identifier {
name: "self"
}
}
arguments {
identifier {
name: "other"
}
}
}
}
}
}
}
}
}
}
}
declarations {
impl {
kind: ExternalImpl
impl_type {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "U"
}
}
}
}
}
}
interface {
identifier {
name: "Number"
}
}
members {
function {
name {
name: "Zero"
}
param_pattern {
}
return_term {
kind: Expression
type {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "U"
}
}
}
}
}
}
}
body {
statements {
return_expression_statement {
expression {
struct_literal {
fields {
name: "x"
expression {
call {
function {
simple_member_access {
field: "Zero"
object {
identifier {
name: "U"
}
}
}
}
argument {
tuple_literal {
}
}
}
}
}
fields {
name: "y"
expression {
call {
function {
simple_member_access {
field: "Zero"
object {
identifier {
name: "U"
}
}
}
}
argument {
tuple_literal {
}
}
}
}
}
}
}
}
}
}
}
}
members {
function {
name {
name: "Add"
}
self_pattern {
binding_pattern {
name: "self"
type {
expression_pattern {
expression {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "U"
}
}
}
}
}
}
}
}
}
}
param_pattern {
fields {
binding_pattern {
name: "other"
type {
expression_pattern {
expression {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "U"
}
}
}
}
}
}
}
}
}
}
}
return_term {
kind: Expression
type {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "U"
}
}
}
}
}
}
}
body {
statements {
return_expression_statement {
expression {
struct_literal {
fields {
name: "x"
expression {
call {
function {
simple_member_access {
field: "Add"
object {
simple_member_access {
field: "x"
object {
identifier {
name: "self"
}
}
}
}
}
}
argument {
tuple_literal {
fields {
simple_member_access {
field: "x"
object {
identifier {
name: "other"
}
}
}
}
}
}
}
}
}
fields {
name: "y"
expression {
call {
function {
simple_member_access {
field: "Add"
object {
simple_member_access {
field: "y"
object {
identifier {
name: "self"
}
}
}
}
}
}
argument {
tuple_literal {
fields {
simple_member_access {
field: "y"
object {
identifier {
name: "other"
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
declarations {
function {
name {
name: "Sum"
}
deduced_parameters {
name: "E"
type {
identifier {
name: "Number"
}
}
}
param_pattern {
fields {
binding_pattern {
name: "x"
type {
expression_pattern {
expression {
identifier {
name: "E"
}
}
}
}
}
}
fields {
binding_pattern {
name: "y"
type {
expression_pattern {
expression {
identifier {
name: "E"
}
}
}
}
}
}
}
return_term {
kind: Expression
type {
identifier {
name: "E"
}
}
}
body {
statements {
variable_definition {
pattern {
binding_pattern {
name: "total"
type {
expression_pattern {
expression {
identifier {
name: "E"
}
}
}
}
}
}
init {
call {
function {
simple_member_access {
field: "Zero"
object {
identifier {
name: "E"
}
}
}
}
argument {
tuple_literal {
}
}
}
}
is_returned: false
}
}
statements {
assign {
lhs {
identifier {
name: "total"
}
}
rhs {
call {
function {
simple_member_access {
field: "Add"
object {
identifier {
name: "total"
}
}
}
}
argument {
tuple_literal {
fields {
identifier {
name: "x"
}
}
}
}
}
}
op: Plain
}
}
statements {
assign {
lhs {
identifier {
name: "total"
}
}
rhs {
call {
function {
simple_member_access {
field: "Add"
object {
identifier {
name: "total"
}
}
}
}
argument {
tuple_literal {
fields {
identifier {
name: "y"
}
}
}
}
}
}
op: Plain
}
}
statements {
return_expression_statement {
expression {
identifier {
name: "total"
}
}
}
}
}
}
}
declarations {
function {
name {
name: "SumPoints"
}
deduced_parameters {
name: "E"
type {
identifier {
name: "Number"
}
}
}
param_pattern {
fields {
binding_pattern {
name: "p"
type {
expression_pattern {
expression {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "E"
}
}
}
}
}
}
}
}
}
}
fields {
binding_pattern {
name: "q"
type {
expression_pattern {
expression {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "E"
}
}
}
}
}
}
}
}
}
}
}
return_term {
kind: Expression
type {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "E"
}
}
}
}
}
}
}
body {
statements {
return_expression_statement {
expression {
call {
function {
identifier {
name: "Sum"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "p"
}
}
fields {
identifier {
name: "q"
}
}
}
}
}
}
}
}
}
}
}
declarations {
function {
name {
name: "Main"
}
param_pattern {
}
return_term {
kind: Expression
type {
int_type_literal {
}
}
}
body {
statements {
variable_definition {
pattern {
binding_pattern {
name: "p"
type {
expression_pattern {
expression {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
int_type_literal {
}
}
}
}
}
}
}
}
}
}
init {
struct_literal {
fields {
name: "x"
expression {
int_literal {
value: 1
}
}
}
fields {
name: "y"
expression {
int_literal {
value: 2
}
}
}
}
}
is_returned: false
}
}
statements {
variable_definition {
pattern {
binding_pattern {
name: "q"
type {
expression_pattern {
expression {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
int_type_literal {
}
}
}
}
}
}
}
}
}
}
init {
struct_literal {
fields {
name: "x"
expression {
int_literal {
value: 4
}
}
}
fields {
name: "y"
expression {
int_literal {
value: 3
}
}
}
}
}
is_returned: false
}
}
statements {
variable_definition {
pattern {
binding_pattern {
name: "r"
type {
expression_pattern {
expression {
call {
function {
identifier {
name: "Point"
}
}
argument {
tuple_literal {
fields {
int_type_literal {
}
}
}
}
}
}
}
}
}
}
init {
call {
function {
identifier {
name: "SumPoints"
}
}
argument {
tuple_literal {
fields {
identifier {
name: "p"
}
}
fields {
identifier {
name: "q"
}
}
}
}
}
}
is_returned: false
}
}
statements {
return_expression_statement {
expression {
operator {
op: Sub
arguments {
simple_member_access {
field: "x"
object {
identifier {
name: "r"
}
}
}
}
arguments {
simple_member_access {
field: "y"
object {
identifier {
name: "r"
}
}
}
}
}
}
}
}
}
}
}
}