GLOBAL TypeQual MergeTypeQuals(TypeQual left, TypeQual right, Coord coord) { TypeQual scl, scr, dql, dqr, tql, tqr; TypeQual result = tq_attribute(JoinLists(left.attributes,right.attributes)); scl = tq_storage_class(left); scr = tq_storage_class(right); if (tq_has_anything(scl) && tq_has_anything(scr)) { if (tq_equal(scl, scr)) { /* scl == scr == single storage class */ char name[20]; TQtoText(name, 20, scl); name[strlen(name) - 1] = 0; WarningCoord(4, coord, "redundant storage class `%s'", name); } else { char namel[20], namer[20]; TQtoText(namel, 20, scl); namel[strlen(namel) - 1] = 0; TQtoText(namer, 20, scr); namer[strlen(namer) - 1] = 0; SyntaxErrorCoord(coord, "conflicting storage classes `%s' and `%s'", namel, namer); } result = tq_union(result, scl); } else { result = tq_union(result, tq_union(scl, scr)); } dql = tq_subtract(tq_decl_quals(left), scl); dqr = tq_subtract(tq_decl_quals(right), scr); if (tq_has_anything(tq_intersection(dql, dqr))) { char name[20]; TQtoText(name, 20, tq_intersection(dql, dqr)); name[strlen(name) - 1] = 0; WarningCoord(4, coord, "redundant declaration qualifier `%s'", name); } result = tq_union(result, tq_union(dql, dqr)); tql = tq_type_quals(left); tqr = tq_type_quals(right); if (tq_has_anything(tq_intersection(tql, tqr))) { char name[20]; TQtoText(name, 20, tq_intersection(tql, tqr)); name[strlen(name) - 1] = 0; WarningCoord(4, coord, "redundant type qualifier `%s'", name); } result = tq_union(result, tq_union(tql, tqr)); return (result); }
GLOBAL int PrintTQ(FILE *out, TypeQual tq) { char tmp[256]; TQtoText(tmp, tq); fputs(tmp, out); return strlen(tmp); }
GLOBAL TypeQual MergeTypeQuals(TypeQual left, TypeQual right, Coord coord) { TypeQual scl, scr, dql, dqr, tql, tqr; TypeQual result = 0; scl = STORAGE_CLASS(left); scr = STORAGE_CLASS(right); if (scl != 0 && scr != 0) { if (scl == scr) { /* scl == scr == single storage class */ WarningCoord(4, coord, "redundant storage class"); } else { char namel[20], namer[20]; TQtoText(namel, scl); TQtoText(namer, scr); SyntaxErrorCoord(coord,"conflicting storage classes `%s' and `%s'", namel, namer); } result |= scl; } else { result |= scl | scr; } dql = DECL_QUALS(left) & ~scl; dqr = DECL_QUALS(right) & ~scr; result |= (dql | dqr); tql = TYPE_QUALS(left); tqr = TYPE_QUALS(right); if ((tql & tqr) != 0) { WarningCoord(4, coord, "redundant type qualifier"); } result |= (tql | tqr); return(result); }