Fix init of local sets/vectors via curly brace initializer lists.

This commit is contained in:
Jon Siwek 2013-03-01 16:42:16 -06:00
parent a2556642e6
commit c88babf6ef
3 changed files with 98 additions and 5 deletions

View file

@ -2507,15 +2507,26 @@ bool AssignExpr::TypeCheck(attr_list* attrs)
attr_copy->append((*attrs)[i]); attr_copy->append((*attrs)[i]);
} }
op2 = new TableConstructorExpr(op2->AsListExpr(), attr_copy); if ( op1->Type()->IsSet() )
op2 = new SetConstructorExpr(op2->AsListExpr(), attr_copy);
else
op2 = new TableConstructorExpr(op2->AsListExpr(), attr_copy);
return true; return true;
} }
if ( bt1 == TYPE_VECTOR && bt2 == bt1 && if ( bt1 == TYPE_VECTOR )
op2->Type()->AsVectorType()->IsUnspecifiedVector() )
{ {
op2 = new VectorCoerceExpr(op2, op1->Type()->AsVectorType()); if ( bt2 == bt1 && op2->Type()->AsVectorType()->IsUnspecifiedVector() )
return true; {
op2 = new VectorCoerceExpr(op2, op1->Type()->AsVectorType());
return true;
}
if ( op2->Tag() == EXPR_LIST )
{
op2 = new VectorConstructorExpr(op2->AsListExpr());
return true;
}
} }
if ( op1->Type()->Tag() == TYPE_RECORD && if ( op1->Type()->Tag() == TYPE_RECORD &&

View file

@ -0,0 +1,44 @@
{
[2/tcp] = 2,
[1/tcp] = 1,
[3/tcp] = 3
}
{
[2/tcp] = 2,
[1/tcp] = 1,
[3/tcp] = 3
}
{
2/tcp,
1/tcp,
3/tcp
}
{
2/tcp,
1/tcp,
3/tcp
}
[1/tcp, 2/tcp, 3/tcp, 1/tcp]
[1/tcp, 2/tcp, 3/tcp, 1/tcp]
{
[2/tcp] = 2,
[1/tcp] = 1,
[3/tcp] = 3
}
{
[2/tcp] = 2,
[1/tcp] = 1,
[3/tcp] = 3
}
{
2/tcp,
1/tcp,
3/tcp
}
{
2/tcp,
1/tcp,
3/tcp
}
[1/tcp, 2/tcp, 3/tcp, 1/tcp]
[1/tcp, 2/tcp, 3/tcp, 1/tcp]

View file

@ -0,0 +1,38 @@
# @TEST-EXEC: bro -b %INPUT >out
# @TEST-EXEC: btest-diff out
# All various container contructors should work at both global and local scope.
global gt1: table[port] of count = table( [1/tcp] = 1, [2/tcp] = 2, [3/tcp] = 3 );
global gs1: set[port] = set( 1/tcp, 2/tcp, 3/tcp );
global gv1: vector of port = vector( 1/tcp, 2/tcp, 3/tcp, 1/tcp );
global gt2: table[port] of count = { [1/tcp] = 1, [2/tcp] = 2, [3/tcp] = 3 };
global gs2: set[port] = { 1/tcp, 2/tcp, 3/tcp };
global gv2: vector of port = { 1/tcp, 2/tcp, 3/tcp, 1/tcp };
local t1: table[port] of count = table( [1/tcp] = 1, [2/tcp] = 2, [3/tcp] = 3 );
local s1: set[port] = set( 1/tcp, 2/tcp, 3/tcp );
local v1: vector of port = vector( 1/tcp, 2/tcp, 3/tcp, 1/tcp );
local t2: table[port] of count = { [1/tcp] = 1, [2/tcp] = 2, [3/tcp] = 3 };
local s2: set[port] = { 1/tcp, 2/tcp, 3/tcp };
local v2: vector of port = { 1/tcp, 2/tcp, 3/tcp, 1/tcp };
print gt1;
print gt2;
print gs1;
print gs2;
print gv1;
print gv2;
print t1;
print t2;
print s1;
print s2;
print v1;
print v2;