mirror of
https://github.com/zeek/zeek.git
synced 2025-10-10 10:38:20 +00:00
clang-format: Set IndentCaseBlocks to false
This commit is contained in:
parent
02206f3215
commit
4423574d26
58 changed files with 4729 additions and 4766 deletions
583
src/Type.cc
583
src/Type.cc
|
@ -459,39 +459,39 @@ static bool is_supported_index_type(const TypePtr& t, const char** tname)
|
|||
return true;
|
||||
|
||||
case TYPE_RECORD:
|
||||
{
|
||||
auto rt = t->AsRecordType();
|
||||
{
|
||||
auto rt = t->AsRecordType();
|
||||
|
||||
for ( auto i = 0; i < rt->NumFields(); ++i )
|
||||
if ( ! is_supported_index_type(rt->GetFieldType(i), tname) )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
case TYPE_LIST:
|
||||
{
|
||||
for ( const auto& type : t->AsTypeList()->GetTypes() )
|
||||
if ( ! is_supported_index_type(type, tname) )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
case TYPE_TABLE:
|
||||
{
|
||||
auto tt = t->AsTableType();
|
||||
|
||||
if ( ! is_supported_index_type(tt->GetIndices(), tname) )
|
||||
for ( auto i = 0; i < rt->NumFields(); ++i )
|
||||
if ( ! is_supported_index_type(rt->GetFieldType(i), tname) )
|
||||
return false;
|
||||
|
||||
const auto& yt = tt->Yield();
|
||||
return true;
|
||||
}
|
||||
|
||||
if ( ! yt )
|
||||
return true;
|
||||
case TYPE_LIST:
|
||||
{
|
||||
for ( const auto& type : t->AsTypeList()->GetTypes() )
|
||||
if ( ! is_supported_index_type(type, tname) )
|
||||
return false;
|
||||
|
||||
return is_supported_index_type(yt, tname);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
case TYPE_TABLE:
|
||||
{
|
||||
auto tt = t->AsTableType();
|
||||
|
||||
if ( ! is_supported_index_type(tt->GetIndices(), tname) )
|
||||
return false;
|
||||
|
||||
const auto& yt = tt->Yield();
|
||||
|
||||
if ( ! yt )
|
||||
return true;
|
||||
|
||||
return is_supported_index_type(yt, tname);
|
||||
}
|
||||
|
||||
case TYPE_VECTOR:
|
||||
return is_supported_index_type(t->AsVectorType()->Yield(), tname);
|
||||
|
@ -1254,23 +1254,23 @@ void RecordType::Create(std::vector<std::optional<ZVal>>& r) const
|
|||
break;
|
||||
|
||||
case FieldInit::R_INIT_DEF:
|
||||
{
|
||||
auto v = init->def_expr->Eval(nullptr);
|
||||
if ( v )
|
||||
{
|
||||
auto v = init->def_expr->Eval(nullptr);
|
||||
if ( v )
|
||||
const auto& t = init->def_type;
|
||||
|
||||
if ( init->def_coerce )
|
||||
{
|
||||
const auto& t = init->def_type;
|
||||
|
||||
if ( init->def_coerce )
|
||||
{
|
||||
auto rt = cast_intrusive<RecordType>(t);
|
||||
v = v->AsRecordVal()->CoerceTo(rt);
|
||||
}
|
||||
|
||||
r_i = ZVal(v, t);
|
||||
auto rt = cast_intrusive<RecordType>(t);
|
||||
v = v->AsRecordVal()->CoerceTo(rt);
|
||||
}
|
||||
else
|
||||
reporter->Error("failed &default in record creation");
|
||||
|
||||
r_i = ZVal(v, t);
|
||||
}
|
||||
else
|
||||
reporter->Error("failed &default in record creation");
|
||||
}
|
||||
break;
|
||||
|
||||
case FieldInit::R_INIT_RECORD:
|
||||
|
@ -1904,81 +1904,81 @@ bool same_type(const Type& arg_t1, const Type& arg_t2, bool is_init, bool match_
|
|||
return true;
|
||||
|
||||
case TYPE_OPAQUE:
|
||||
{
|
||||
const OpaqueType* ot1 = (const OpaqueType*)t1;
|
||||
const OpaqueType* ot2 = (const OpaqueType*)t2;
|
||||
return ot1->Name() == ot2->Name();
|
||||
}
|
||||
{
|
||||
const OpaqueType* ot1 = (const OpaqueType*)t1;
|
||||
const OpaqueType* ot2 = (const OpaqueType*)t2;
|
||||
return ot1->Name() == ot2->Name();
|
||||
}
|
||||
|
||||
case TYPE_TABLE:
|
||||
{
|
||||
const IndexType* it1 = (const IndexType*)t1;
|
||||
const IndexType* it2 = (const IndexType*)t2;
|
||||
{
|
||||
const IndexType* it1 = (const IndexType*)t1;
|
||||
const IndexType* it2 = (const IndexType*)t2;
|
||||
|
||||
const auto& tl1 = it1->GetIndices();
|
||||
const auto& tl2 = it2->GetIndices();
|
||||
const auto& tl1 = it1->GetIndices();
|
||||
const auto& tl2 = it2->GetIndices();
|
||||
|
||||
if ( (tl1 || tl2) && ! (tl1 && tl2) )
|
||||
return false;
|
||||
if ( (tl1 || tl2) && ! (tl1 && tl2) )
|
||||
return false;
|
||||
|
||||
const auto& y1 = t1->Yield();
|
||||
const auto& y2 = t2->Yield();
|
||||
const auto& y1 = t1->Yield();
|
||||
const auto& y2 = t2->Yield();
|
||||
|
||||
if ( (y1 || y2) && ! (y1 && y2) )
|
||||
return false;
|
||||
if ( (y1 || y2) && ! (y1 && y2) )
|
||||
return false;
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case TYPE_FUNC:
|
||||
{
|
||||
const FuncType* ft1 = (const FuncType*)t1;
|
||||
const FuncType* ft2 = (const FuncType*)t2;
|
||||
{
|
||||
const FuncType* ft1 = (const FuncType*)t1;
|
||||
const FuncType* ft2 = (const FuncType*)t2;
|
||||
|
||||
if ( ft1->Flavor() != ft2->Flavor() )
|
||||
return false;
|
||||
if ( ft1->Flavor() != ft2->Flavor() )
|
||||
return false;
|
||||
|
||||
const auto& y1 = t1->Yield();
|
||||
const auto& y2 = t2->Yield();
|
||||
if ( (y1 || y2) && ! (y1 && y2) )
|
||||
return false;
|
||||
const auto& y1 = t1->Yield();
|
||||
const auto& y2 = t2->Yield();
|
||||
if ( (y1 || y2) && ! (y1 && y2) )
|
||||
return false;
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case TYPE_RECORD:
|
||||
{
|
||||
const RecordType* rt1 = (const RecordType*)t1;
|
||||
const RecordType* rt2 = (const RecordType*)t2;
|
||||
{
|
||||
const RecordType* rt1 = (const RecordType*)t1;
|
||||
const RecordType* rt2 = (const RecordType*)t2;
|
||||
|
||||
if ( rt1->NumFields() != rt2->NumFields() )
|
||||
if ( rt1->NumFields() != rt2->NumFields() )
|
||||
return false;
|
||||
|
||||
for ( int i = 0; i < rt1->NumFields(); ++i )
|
||||
{
|
||||
const TypeDecl* td1 = rt1->FieldDecl(i);
|
||||
const TypeDecl* td2 = rt2->FieldDecl(i);
|
||||
|
||||
if ( match_record_field_names && ! util::streq(td1->id, td2->id) )
|
||||
return false;
|
||||
|
||||
for ( int i = 0; i < rt1->NumFields(); ++i )
|
||||
{
|
||||
const TypeDecl* td1 = rt1->FieldDecl(i);
|
||||
const TypeDecl* td2 = rt2->FieldDecl(i);
|
||||
|
||||
if ( match_record_field_names && ! util::streq(td1->id, td2->id) )
|
||||
return false;
|
||||
|
||||
if ( ! same_attrs(td1->attrs.get(), td2->attrs.get()) )
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
if ( ! same_attrs(td1->attrs.get(), td2->attrs.get()) )
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case TYPE_LIST:
|
||||
{
|
||||
const auto& tl1 = t1->AsTypeList()->GetTypes();
|
||||
const auto& tl2 = t2->AsTypeList()->GetTypes();
|
||||
{
|
||||
const auto& tl1 = t1->AsTypeList()->GetTypes();
|
||||
const auto& tl2 = t2->AsTypeList()->GetTypes();
|
||||
|
||||
if ( tl1.size() != tl2.size() )
|
||||
return false;
|
||||
if ( tl1.size() != tl2.size() )
|
||||
return false;
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case TYPE_VECTOR:
|
||||
case TYPE_FILE:
|
||||
|
@ -2024,73 +2024,73 @@ bool same_type(const Type& arg_t1, const Type& arg_t2, bool is_init, bool match_
|
|||
switch ( t1->Tag() )
|
||||
{
|
||||
case TYPE_TABLE:
|
||||
{
|
||||
const IndexType* it1 = (const IndexType*)t1;
|
||||
const IndexType* it2 = (const IndexType*)t2;
|
||||
|
||||
const auto& tl1 = it1->GetIndices();
|
||||
const auto& tl2 = it2->GetIndices();
|
||||
|
||||
if ( ! same_type(tl1, tl2, is_init, match_record_field_names) )
|
||||
result = false;
|
||||
else
|
||||
{
|
||||
const IndexType* it1 = (const IndexType*)t1;
|
||||
const IndexType* it2 = (const IndexType*)t2;
|
||||
const auto& y1 = t1->Yield();
|
||||
const auto& y2 = t2->Yield();
|
||||
|
||||
const auto& tl1 = it1->GetIndices();
|
||||
const auto& tl2 = it2->GetIndices();
|
||||
|
||||
if ( ! same_type(tl1, tl2, is_init, match_record_field_names) )
|
||||
result = false;
|
||||
else
|
||||
{
|
||||
const auto& y1 = t1->Yield();
|
||||
const auto& y2 = t2->Yield();
|
||||
|
||||
result = same_type(y1, y2, is_init, match_record_field_names);
|
||||
}
|
||||
break;
|
||||
result = same_type(y1, y2, is_init, match_record_field_names);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case TYPE_FUNC:
|
||||
{
|
||||
const FuncType* ft1 = (const FuncType*)t1;
|
||||
const FuncType* ft2 = (const FuncType*)t2;
|
||||
{
|
||||
const FuncType* ft1 = (const FuncType*)t1;
|
||||
const FuncType* ft2 = (const FuncType*)t2;
|
||||
|
||||
if ( ! same_type(t1->Yield(), t2->Yield(), is_init, match_record_field_names) )
|
||||
result = false;
|
||||
else
|
||||
result = ft1->CheckArgs(ft2->ParamList()->GetTypes(), is_init, false);
|
||||
break;
|
||||
}
|
||||
if ( ! same_type(t1->Yield(), t2->Yield(), is_init, match_record_field_names) )
|
||||
result = false;
|
||||
else
|
||||
result = ft1->CheckArgs(ft2->ParamList()->GetTypes(), is_init, false);
|
||||
break;
|
||||
}
|
||||
|
||||
case TYPE_RECORD:
|
||||
{
|
||||
const RecordType* rt1 = (const RecordType*)t1;
|
||||
const RecordType* rt2 = (const RecordType*)t2;
|
||||
|
||||
result = true;
|
||||
|
||||
for ( int i = 0; i < rt1->NumFields(); ++i )
|
||||
{
|
||||
const RecordType* rt1 = (const RecordType*)t1;
|
||||
const RecordType* rt2 = (const RecordType*)t2;
|
||||
const TypeDecl* td1 = rt1->FieldDecl(i);
|
||||
const TypeDecl* td2 = rt2->FieldDecl(i);
|
||||
|
||||
result = true;
|
||||
|
||||
for ( int i = 0; i < rt1->NumFields(); ++i )
|
||||
if ( ! same_type(td1->type, td2->type, is_init, match_record_field_names) )
|
||||
{
|
||||
const TypeDecl* td1 = rt1->FieldDecl(i);
|
||||
const TypeDecl* td2 = rt2->FieldDecl(i);
|
||||
|
||||
if ( ! same_type(td1->type, td2->type, is_init, match_record_field_names) )
|
||||
{
|
||||
result = false;
|
||||
break;
|
||||
}
|
||||
result = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case TYPE_LIST:
|
||||
{
|
||||
const auto& tl1 = t1->AsTypeList()->GetTypes();
|
||||
const auto& tl2 = t2->AsTypeList()->GetTypes();
|
||||
{
|
||||
const auto& tl1 = t1->AsTypeList()->GetTypes();
|
||||
const auto& tl2 = t2->AsTypeList()->GetTypes();
|
||||
|
||||
result = true;
|
||||
result = true;
|
||||
|
||||
for ( auto i = 0u; i < tl1.size(); ++i )
|
||||
if ( ! same_type(tl1[i], tl2[i], is_init, match_record_field_names) )
|
||||
{
|
||||
result = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
for ( auto i = 0u; i < tl1.size(); ++i )
|
||||
if ( ! same_type(tl1[i], tl2[i], is_init, match_record_field_names) )
|
||||
{
|
||||
result = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case TYPE_VECTOR:
|
||||
case TYPE_FILE:
|
||||
|
@ -2098,13 +2098,12 @@ bool same_type(const Type& arg_t1, const Type& arg_t2, bool is_init, bool match_
|
|||
break;
|
||||
|
||||
case TYPE_TYPE:
|
||||
{
|
||||
auto tt1 = t1->AsTypeType();
|
||||
auto tt2 = t2->AsTypeType();
|
||||
result =
|
||||
same_type(tt1->GetType(), tt1->GetType(), is_init, match_record_field_names);
|
||||
break;
|
||||
}
|
||||
{
|
||||
auto tt1 = t1->AsTypeType();
|
||||
auto tt2 = t2->AsTypeType();
|
||||
result = same_type(tt1->GetType(), tt1->GetType(), is_init, match_record_field_names);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
result = false;
|
||||
|
@ -2287,180 +2286,180 @@ TypePtr merge_types(const TypePtr& arg_t1, const TypePtr& arg_t2)
|
|||
return base_type(tg1);
|
||||
|
||||
case TYPE_ENUM:
|
||||
{
|
||||
// Could compare pointers t1 == t2, but maybe there's someone out
|
||||
// there creating clones of the type, so safer to compare name.
|
||||
if ( t1->GetName() != t2->GetName() )
|
||||
{
|
||||
// Could compare pointers t1 == t2, but maybe there's someone out
|
||||
// there creating clones of the type, so safer to compare name.
|
||||
if ( t1->GetName() != t2->GetName() )
|
||||
{
|
||||
std::string msg = util::fmt("incompatible enum types: '%s' and '%s'",
|
||||
t1->GetName().data(), t2->GetName().data());
|
||||
std::string msg = util::fmt("incompatible enum types: '%s' and '%s'",
|
||||
t1->GetName().data(), t2->GetName().data());
|
||||
|
||||
t1->Error(msg.data(), t2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Doing a lookup here as a roundabout way of ref-ing t1, without
|
||||
// changing the function params which has t1 as const and also
|
||||
// (potentially) avoiding a pitfall mentioned earlier about clones.
|
||||
const auto& id = detail::global_scope()->Find(t1->GetName());
|
||||
|
||||
if ( id && id->IsType() && id->GetType()->Tag() == TYPE_ENUM )
|
||||
// It should make most sense to return the real type here rather
|
||||
// than a copy since it may be redef'd later in parsing. If we
|
||||
// return a copy, then whoever is using this return value won't
|
||||
// actually see those changes from the redef.
|
||||
return id->GetType();
|
||||
|
||||
std::string msg =
|
||||
util::fmt("incompatible enum types: '%s' and '%s'"
|
||||
" ('%s' enum type ID is invalid)",
|
||||
t1->GetName().data(), t2->GetName().data(), t1->GetName().data());
|
||||
t1->Error(msg.data(), t2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Doing a lookup here as a roundabout way of ref-ing t1, without
|
||||
// changing the function params which has t1 as const and also
|
||||
// (potentially) avoiding a pitfall mentioned earlier about clones.
|
||||
const auto& id = detail::global_scope()->Find(t1->GetName());
|
||||
|
||||
if ( id && id->IsType() && id->GetType()->Tag() == TYPE_ENUM )
|
||||
// It should make most sense to return the real type here rather
|
||||
// than a copy since it may be redef'd later in parsing. If we
|
||||
// return a copy, then whoever is using this return value won't
|
||||
// actually see those changes from the redef.
|
||||
return id->GetType();
|
||||
|
||||
std::string msg =
|
||||
util::fmt("incompatible enum types: '%s' and '%s'"
|
||||
" ('%s' enum type ID is invalid)",
|
||||
t1->GetName().data(), t2->GetName().data(), t1->GetName().data());
|
||||
t1->Error(msg.data(), t2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
case TYPE_TABLE:
|
||||
{
|
||||
const IndexType* it1 = (const IndexType*)t1;
|
||||
const IndexType* it2 = (const IndexType*)t2;
|
||||
|
||||
const auto& tl1 = it1->GetIndexTypes();
|
||||
const auto& tl2 = it2->GetIndexTypes();
|
||||
TypeListPtr tl3;
|
||||
|
||||
if ( tl1.size() != tl2.size() )
|
||||
{
|
||||
const IndexType* it1 = (const IndexType*)t1;
|
||||
const IndexType* it2 = (const IndexType*)t2;
|
||||
t1->Error("incompatible types", t2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const auto& tl1 = it1->GetIndexTypes();
|
||||
const auto& tl2 = it2->GetIndexTypes();
|
||||
TypeListPtr tl3;
|
||||
tl3 = make_intrusive<TypeList>();
|
||||
|
||||
if ( tl1.size() != tl2.size() )
|
||||
for ( auto i = 0u; i < tl1.size(); ++i )
|
||||
{
|
||||
auto tl3_i = merge_types(tl1[i], tl2[i]);
|
||||
if ( ! tl3_i )
|
||||
return nullptr;
|
||||
|
||||
tl3->Append(std::move(tl3_i));
|
||||
}
|
||||
|
||||
const auto& y1 = t1->Yield();
|
||||
const auto& y2 = t2->Yield();
|
||||
TypePtr y3;
|
||||
|
||||
if ( y1 || y2 )
|
||||
{
|
||||
if ( ! y1 || ! y2 )
|
||||
{
|
||||
t1->Error("incompatible types", t2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
tl3 = make_intrusive<TypeList>();
|
||||
|
||||
for ( auto i = 0u; i < tl1.size(); ++i )
|
||||
{
|
||||
auto tl3_i = merge_types(tl1[i], tl2[i]);
|
||||
if ( ! tl3_i )
|
||||
return nullptr;
|
||||
|
||||
tl3->Append(std::move(tl3_i));
|
||||
}
|
||||
|
||||
const auto& y1 = t1->Yield();
|
||||
const auto& y2 = t2->Yield();
|
||||
TypePtr y3;
|
||||
|
||||
if ( y1 || y2 )
|
||||
{
|
||||
if ( ! y1 || ! y2 )
|
||||
{
|
||||
t1->Error("incompatible types", t2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
y3 = merge_types(y1, y2);
|
||||
if ( ! y3 )
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if ( t1->IsSet() )
|
||||
return make_intrusive<SetType>(std::move(tl3), nullptr);
|
||||
else
|
||||
return make_intrusive<TableType>(std::move(tl3), std::move(y3));
|
||||
y3 = merge_types(y1, y2);
|
||||
if ( ! y3 )
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if ( t1->IsSet() )
|
||||
return make_intrusive<SetType>(std::move(tl3), nullptr);
|
||||
else
|
||||
return make_intrusive<TableType>(std::move(tl3), std::move(y3));
|
||||
}
|
||||
|
||||
case TYPE_FUNC:
|
||||
{
|
||||
if ( ! same_type(t1, t2) )
|
||||
{
|
||||
if ( ! same_type(t1, t2) )
|
||||
{
|
||||
t1->Error("incompatible types", t2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const FuncType* ft1 = (const FuncType*)t1;
|
||||
const FuncType* ft2 = (const FuncType*)t1;
|
||||
auto args = cast_intrusive<RecordType>(merge_types(ft1->Params(), ft2->Params()));
|
||||
auto yield = t1->Yield() ? merge_types(t1->Yield(), t2->Yield()) : nullptr;
|
||||
|
||||
return make_intrusive<FuncType>(std::move(args), std::move(yield), ft1->Flavor());
|
||||
t1->Error("incompatible types", t2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const FuncType* ft1 = (const FuncType*)t1;
|
||||
const FuncType* ft2 = (const FuncType*)t1;
|
||||
auto args = cast_intrusive<RecordType>(merge_types(ft1->Params(), ft2->Params()));
|
||||
auto yield = t1->Yield() ? merge_types(t1->Yield(), t2->Yield()) : nullptr;
|
||||
|
||||
return make_intrusive<FuncType>(std::move(args), std::move(yield), ft1->Flavor());
|
||||
}
|
||||
|
||||
case TYPE_RECORD:
|
||||
{
|
||||
const RecordType* rt1 = (const RecordType*)t1;
|
||||
const RecordType* rt2 = (const RecordType*)t2;
|
||||
|
||||
if ( rt1->NumFields() != rt2->NumFields() )
|
||||
return nullptr;
|
||||
|
||||
type_decl_list* tdl3 = new type_decl_list(rt1->NumFields());
|
||||
|
||||
for ( int i = 0; i < rt1->NumFields(); ++i )
|
||||
{
|
||||
const RecordType* rt1 = (const RecordType*)t1;
|
||||
const RecordType* rt2 = (const RecordType*)t2;
|
||||
const TypeDecl* td1 = rt1->FieldDecl(i);
|
||||
const TypeDecl* td2 = rt2->FieldDecl(i);
|
||||
auto tdl3_i = merge_types(td1->type, td2->type);
|
||||
|
||||
if ( rt1->NumFields() != rt2->NumFields() )
|
||||
return nullptr;
|
||||
|
||||
type_decl_list* tdl3 = new type_decl_list(rt1->NumFields());
|
||||
|
||||
for ( int i = 0; i < rt1->NumFields(); ++i )
|
||||
if ( ! util::streq(td1->id, td2->id) || ! tdl3_i )
|
||||
{
|
||||
const TypeDecl* td1 = rt1->FieldDecl(i);
|
||||
const TypeDecl* td2 = rt2->FieldDecl(i);
|
||||
auto tdl3_i = merge_types(td1->type, td2->type);
|
||||
|
||||
if ( ! util::streq(td1->id, td2->id) || ! tdl3_i )
|
||||
{
|
||||
t1->Error("incompatible record fields", t2);
|
||||
delete tdl3;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
tdl3->push_back(new TypeDecl(util::copy_string(td1->id), std::move(tdl3_i)));
|
||||
t1->Error("incompatible record fields", t2);
|
||||
delete tdl3;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return make_intrusive<RecordType>(tdl3);
|
||||
tdl3->push_back(new TypeDecl(util::copy_string(td1->id), std::move(tdl3_i)));
|
||||
}
|
||||
|
||||
return make_intrusive<RecordType>(tdl3);
|
||||
}
|
||||
|
||||
case TYPE_LIST:
|
||||
{
|
||||
const TypeList* tl1 = t1->AsTypeList();
|
||||
const TypeList* tl2 = t2->AsTypeList();
|
||||
|
||||
if ( tl1->IsPure() != tl2->IsPure() )
|
||||
{
|
||||
const TypeList* tl1 = t1->AsTypeList();
|
||||
const TypeList* tl2 = t2->AsTypeList();
|
||||
|
||||
if ( tl1->IsPure() != tl2->IsPure() )
|
||||
{
|
||||
tl1->Error("incompatible lists", tl2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const auto& l1 = tl1->GetTypes();
|
||||
const auto& l2 = tl2->GetTypes();
|
||||
|
||||
if ( l1.size() == 0 || l2.size() == 0 )
|
||||
{
|
||||
if ( l1.size() == 0 )
|
||||
tl1->Error("empty list");
|
||||
else
|
||||
tl2->Error("empty list");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if ( tl1->IsPure() )
|
||||
{
|
||||
// We will be expanding the pure list when converting
|
||||
// the initialization expression into a set of values.
|
||||
// So the merge type of the list is the type of one
|
||||
// of the elements, providing they're consistent.
|
||||
return merge_types(l1[0], l2[0]);
|
||||
}
|
||||
|
||||
// Impure lists - must have the same size and match element
|
||||
// by element.
|
||||
if ( l1.size() != l2.size() )
|
||||
{
|
||||
tl1->Error("different number of indices", tl2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto tl3 = make_intrusive<TypeList>();
|
||||
|
||||
for ( auto i = 0u; i < l1.size(); ++i )
|
||||
tl3->Append(merge_types(l1[i], l2[i]));
|
||||
|
||||
return tl3;
|
||||
tl1->Error("incompatible lists", tl2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const auto& l1 = tl1->GetTypes();
|
||||
const auto& l2 = tl2->GetTypes();
|
||||
|
||||
if ( l1.size() == 0 || l2.size() == 0 )
|
||||
{
|
||||
if ( l1.size() == 0 )
|
||||
tl1->Error("empty list");
|
||||
else
|
||||
tl2->Error("empty list");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if ( tl1->IsPure() )
|
||||
{
|
||||
// We will be expanding the pure list when converting
|
||||
// the initialization expression into a set of values.
|
||||
// So the merge type of the list is the type of one
|
||||
// of the elements, providing they're consistent.
|
||||
return merge_types(l1[0], l2[0]);
|
||||
}
|
||||
|
||||
// Impure lists - must have the same size and match element
|
||||
// by element.
|
||||
if ( l1.size() != l2.size() )
|
||||
{
|
||||
tl1->Error("different number of indices", tl2);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto tl3 = make_intrusive<TypeList>();
|
||||
|
||||
for ( auto i = 0u; i < l1.size(); ++i )
|
||||
tl3->Append(merge_types(l1[i], l2[i]));
|
||||
|
||||
return tl3;
|
||||
}
|
||||
|
||||
case TYPE_VECTOR:
|
||||
if ( ! same_type(t1->Yield(), t2->Yield()) )
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue