decls and state names, are they in the same namespaces?
Take:
parser p()
{
bit<4> t;
state start {
t = 1;
transition t;
}
state t {
transition accept;
}
}
Currently p4c rejects this with saying t is declared as a different type. The spec just mentions that 2 states need to be not named the same but it does not say anything about naming the same as the a local decl. I found this on accident when I was writing up a testcase for value_set.
This is what the spec says:
At least one state, named start, must be present in any parser. A parser may not define two states with the same name. It is also illegal for a parser to give explicit definitions for the accept and reject states—those states are logically distinct from the states defined by the programmer.
FWIW, Petr4 accepts this. I think p4c is overly conservative here.
At least p4c is catching the error that the transition statement needs a state, not a bit field to transition to. Now, should p4c detect invalid type first or detect name clash with decl first or test for both and then emit both errors?
@hesingh I don't think it has to be an error. Parser starts can be declared in any order. So the transition may legally be to the state t.
I know parser states can be in any order, but p4c should at least give an error that the Parser never reaches accept or reject state. With changes to P4 code as shown below, latest p4c-bm2-ss does give the error for not reaching accept or reject state. The p4c frontend emits the error.
-- a/testdata/p4_16_samples/basic_routing-bmv2.p4
+++ b/testdata/p4_16_samples/basic_routing-bmv2.p4
@@ -38,6 +38,7 @@ struct headers {
}
parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+ bit<8> j;
state parse_ethernet {
packet.extract(hdr = hdr.ethernet);
transition select(hdr.ethernet.etherType) {
@@ -50,7 +51,8 @@ parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout
transition accept;
}
state start {
- transition parse_ethernet;
+ j = 1;
+ transition j; //parse_ethernet;
}
}
The LDWG has established that the compiler implements the correct behavior: https://github.com/p4lang/p4-spec/pull/1217