ctkind_fromInt (int i)
{
/*@+enumint@*/
- if (i < CTK_ANYTYPE || i > CTK_COMPLEX)
+ if (i < CTK_UNKNOWN || i > CTK_COMPLEX)
{
llcontbug (message ("ctkind_fromInt: out of range: %d", i));
return CTK_INVALID;
ctype
ctype_createAbstract (typeId u)
{
- /* requires: ctype_createAbstract (u) is never called more than once for any u. */
- /* [ tested by cttable_addFullSafe, not really required ] */
+ /* requires: ctype_createAbstract (u) is never called more than once for any u. */
+ /* [ tested by cttable_addFullSafe, not really required ] */
+
return (cttable_addFullSafe (ctentry_makeNew (CTK_PLAIN, ctbase_createAbstract (u))));
}
return c;
}
-static bool
-ctype_isSpecialType (ctype c)
-{
- return (ctype_isUnknown (c) || ctype_isAnytype (c));
-}
-
bool
ctype_isUA (ctype c)
{
- return (!ctype_isSpecialType (c)
+ return (!ctype_isUnknown (c)
&& ctbase_isUA (ctype_getCtbase (c)));
}
bool
ctype_isUser (ctype c)
{
- return (!ctype_isSpecialType (c)
- && ctbase_isUser (ctype_getCtbase (c)));
+ return (!ctype_isUnknown (c) && ctbase_isUser (ctype_getCtbase (c)));
}
bool
ctype_isAbstract (ctype c)
{
- return (!ctype_isSpecialType (c)
+ return (!ctype_isUnknown (c)
&& ((ctype_isPlain (c) && ctbase_isAbstract (ctype_getCtbaseSafe (c))) ||
(ctype_isConj (c) &&
(ctype_isAbstract (ctype_getConjA (c))
ctype
ctype_getReturnType (ctype c)
{
- if (ctype_isSpecialType (c))
+ if (ctype_isUnknown (c))
{
- return c;
+ return ctype_unknown;
}
return (ctbase_baseFunction (ctype_getCtbaseSafe (c)));
/*@observer@*/ uentryList
ctype_argsFunction (ctype c)
{
- if (ctype_isSpecialType (c))
+ if (ctype_isUnknown (c))
{
return uentryList_undefined;
}
ctentry ce1;
ctentry ce2;
- if (ctype_isSpecialType (c1))
+ if (ctype_isUnknown (c1))
{
- if (ctype_isSpecialType (c2))
+ if (ctype_isUnknown (c2))
{
return 0;
}
}
}
- if (ctype_isSpecialType (c2))
+ if (ctype_isUnknown (c2))
{
return -1;
}
static ctype
ctype_makeConjAux (ctype c1, ctype c2, bool isExplicit)
{
- DPRINTF (("Make conj: %s / %s", ctype_unparse (c1), ctype_unparse (c2)));
-
if (ctype_isBogus (c1) || ctype_isUndefined (c1))
{
return c2;
ctype
ctype_makeExplicitConj (ctype c1, ctype c2)
{
- DPRINTF (("Make conj: %s / %s", ctype_unparse (c1), ctype_unparse (c2)));
-
- if (ctype_isFunction (c1) && !ctype_isFunction (c2))
+ if (ctype_isAnytype (c1) || ctype_isAnytype (c2))
+ {
+ return ctype_makeAnytype ();
+ }
+ else if (ctype_isFunction (c1) && !ctype_isFunction (c2))
{
ctype ret = ctype_makeExplicitConj (ctype_getReturnType (c1), c2);
static ctype ivbf = ctype_unknown; /* int | void * | bool | float */
static ctype cuc = ctype_unknown; /* char | unsigned char */
+static ctype cany = ctype_unknown;
+
+ctype
+ctype_makeAnytype ()
+{
+ if (cany == ctype_unknown)
+ {
+ cany = ctype_makeConj (ctype_unknown, ctype_dne);
+ llassert (ctype_isAnytype (cany));
+ }
+
+ DPRINTF (("make anytype: %s", ctype_unparse (cany)));
+ return cany;
+}
+
+bool
+ctype_isAnytype (ctype c)
+{
+ return (c == cany);
+}
+
static void
ctype_recordConj (ctype c)
{
DPRINTF (("Make conj: %s / %s", ctype_unparse (c1), ctype_unparse (c2)));
- if (ctype_isUnknown (c1))
+ if (ctype_isAnytype (c1))
+ {
+ return c1;
+ }
+ else if (ctype_isAnytype (c2))
+ {
+ return c2;
+ }
+ else if (ctype_isUnknown (c1))
{
return c2;
}
{
;
}
-
return (cttable_addComplex (ctbase_makeConj (c1, c2, FALSE)));
}
return TRUE;
if (ctype_isElips (c1))
- return (ctype_isElips (c2) || ctype_isSpecialType (c2));
+ return (ctype_isElips (c2) || ctype_isUnknown (c2));
if (ctype_isElips (c2))
{
- return (ctype_isSpecialType (c2));
+ return (ctype_isUnknown (c2));
}
else
{
return TRUE;
if (ctype_isElips (c1))
- {
- return (ctype_isElips (c2) || ctype_isSpecialType (c2));
- }
-
+ return (ctype_isElips (c2) || ctype_isUnknown (c2));
+
if (ctype_isElips (c2))
- {
- return (ctype_isSpecialType (c2));
- }
+ return (ctype_isUnknown (c2));
return (ctbase_match (ctype_getCtbase (c1), ctype_getCtbase (c2)));
}
cstring
ctype_unparseDeclaration (ctype c, /*@only@*/ cstring name)
{
- llassert (! (ctype_isElips (c) || ctype_isMissingParamsMarker (c)));
+ llassert (!(ctype_isElips (c) || ctype_isMissingParamsMarker (c)));
- if (ctype_isSpecialType (c))
+ if (ctype_isUnknown (c))
{
return message ("? %q", name);
}
{
return cstring_makeLiteralTemp ("-");
}
- else if (ctype_isUnknown (c))
- {
- return cstring_makeLiteralTemp ("?");
- }
else if (ctype_isAnytype (c))
{
return cstring_makeLiteralTemp ("<any>");
}
+ else if (ctype_isUnknown (c))
+ {
+ return cstring_makeLiteralTemp ("?");
+ }
else
{
/*@-modobserver@*/
switch (ctentry_getKind (cte))
{
- case CTK_ANYTYPE:
case CTK_UNKNOWN:
case CTK_INVALID:
case CTK_PLAIN:
}
ctype
-ctype_adjustPointers (int np, ctype c)
+ctype_adjustPointers (pointers p, ctype c)
{
-
+ int np = pointers_depth (p);
+
if (ctype_isFunction (c))
{
c = ctype_makeParamsFunction
- (ctype_adjustPointers (np, ctype_getReturnType (c)),
+ (ctype_adjustPointers (p, ctype_getReturnType (c)),
uentryList_copy (ctype_argsFunction (c)));
}
else
return (ct);
}
+ctype
+ctype_createForwardEnum (cstring n)
+{
+ uentry ue = uentry_makeEnumTag (n, ctype_unknown, fileloc_undefined);
+ ctype ct = usymtab_supForwardTypeEntry (ue);
+
+ cstring_free (n);
+ return (ct);
+}
+
ctype
ctype_removePointers (ctype c)
{
bool ctype_isVisiblySharable (ctype t)
{
- if (ctype_isSpecialType (t)) return TRUE;
+ if (ctype_isUnknown (t)) return TRUE;
if (ctype_isConj (t))
{
ctype ctype_resolve (ctype c)
{
- if (ctype_isUnknown (c))
+ if (ctype_isUnknown (c) && !ctype_isAnytype (c))
{
- DPRINTF (("Resolving! %s", ctype_unparse (c)));
+ DPRINTF (("Resolving to int: %s", ctype_unparse (c)));
return ctype_int;
}
- else if (c == ctype_anytype)
- {
- return ctype_unknown;
- }
- else
- {
- return c;
- }
+
+ return c;
}
ctype ctype_fromQual (qual q)
llbuglit ("ctype_getCtbase: ctype dne");
if (c == ctype_elipsMarker)
llbuglit ("ctype_getCtbase: elips marker");
- if (c == ctype_anytype)
- llbuglit ("ctype_getCtbase: ctype anytype");
-
+
llfatalbug (message ("ctype_getCtbase: ctype out of range: %d", c));
BADEXIT;
}
}
else if (c == CTK_UNKNOWN)
llcontbuglit ("ctype_getCtentry: ctype unknown");
- else if (c == CTK_ANYTYPE)
- llcontbuglit ("ctype_getCtentry: ctype unknown");
else if (c == CTK_INVALID)
llcontbuglit ("ctype_getCtentry: ctype invalid (ctype_undefined)");
else if (c == CTK_DNE)