Merge remote-tracking branch 'upstream/master' into pcenginetarget
This commit is contained in:
@@ -2316,21 +2316,25 @@ Here's a list of all control commands and a description, what they do:
|
|||||||
</verb></tscreen>
|
</verb></tscreen>
|
||||||
|
|
||||||
|
|
||||||
<sect1><tt>.ISMNEM, .ISMNEMONIC</tt><label id=".ISMNEMONIC"><p>
|
<sect1><tt>.DEFINEDMACRO</tt><label id=".DEFINEDMACRO"><p>
|
||||||
|
|
||||||
Builtin function. The function expects an identifier as argument in braces.
|
Builtin function. The function expects an identifier as argument in braces.
|
||||||
The argument is evaluated, and the function yields "true" if the identifier
|
The argument is evaluated, and the function yields "true" if the identifier
|
||||||
is defined as an instruction mnemonic that is recognized by the assembler.
|
has already been defined as the name of a macro. Otherwise the function yields
|
||||||
Example:
|
false. Example:
|
||||||
|
|
||||||
<tscreen><verb>
|
<tscreen><verb>
|
||||||
.if .not .ismnemonic(ina)
|
.macro add foo
|
||||||
.macro ina
|
clc
|
||||||
|
adc foo
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.if .definedmacro(add)
|
||||||
|
add #$01
|
||||||
|
.else
|
||||||
clc
|
clc
|
||||||
adc #$01
|
adc #$01
|
||||||
.endmacro
|
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
</verb></tscreen>
|
</verb></tscreen>
|
||||||
|
|
||||||
|
|
||||||
@@ -3158,6 +3162,23 @@ Here's a list of all control commands and a description, what they do:
|
|||||||
the feature in more detail.
|
the feature in more detail.
|
||||||
|
|
||||||
|
|
||||||
|
<sect1><tt>.ISMNEM, .ISMNEMONIC</tt><label id=".ISMNEMONIC"><p>
|
||||||
|
|
||||||
|
Builtin function. The function expects an identifier as argument in braces.
|
||||||
|
The argument is evaluated, and the function yields "true" if the identifier
|
||||||
|
is defined as an instruction mnemonic that is recognized by the assembler.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
<tscreen><verb>
|
||||||
|
.if .not .ismnemonic(ina)
|
||||||
|
.macro ina
|
||||||
|
clc
|
||||||
|
adc #$01
|
||||||
|
.endmacro
|
||||||
|
.endif
|
||||||
|
</verb></tscreen>
|
||||||
|
|
||||||
|
|
||||||
<sect1><tt>.LINECONT</tt><label id=".LINECONT"><p>
|
<sect1><tt>.LINECONT</tt><label id=".LINECONT"><p>
|
||||||
|
|
||||||
Switch on or off line continuations using the backslash character
|
Switch on or off line continuations using the backslash character
|
||||||
|
|||||||
@@ -418,30 +418,22 @@ static ExprNode* FuncDefined (void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static ExprNode* FuncIsMnemonic (void)
|
static ExprNode* FuncDefinedMacro (void)
|
||||||
/* Handle the .ISMNEMONIC, .ISMNEM builtin function */
|
/* Handle the .DEFINEDMACRO builtin function */
|
||||||
{
|
{
|
||||||
int Instr = -1;
|
Macro* Mac = 0;
|
||||||
|
|
||||||
/* Check for a macro or an instruction depending on UbiquitousIdents */
|
/* Check if the identifier is a macro */
|
||||||
|
|
||||||
if (CurTok.Tok == TOK_IDENT) {
|
if (CurTok.Tok == TOK_IDENT) {
|
||||||
if (UbiquitousIdents) {
|
Mac = FindMacro (&CurTok.SVal);
|
||||||
/* Macros CAN be instructions, so check for them first */
|
|
||||||
if (FindMacro (&CurTok.SVal) == 0) {
|
|
||||||
Instr = FindInstruction (&CurTok.SVal);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* Macros and symbols may NOT use the names of instructions, so just check for the instruction */
|
|
||||||
Instr = FindInstruction (&CurTok.SVal);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
Error ("Identifier expected.");
|
Error ("Identifier expected.");
|
||||||
}
|
}
|
||||||
/* Skip the name */
|
/* Skip the name */
|
||||||
NextTok ();
|
NextTok ();
|
||||||
|
|
||||||
return GenLiteralExpr (Instr > 0);
|
return GenLiteralExpr (Mac != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -462,6 +454,36 @@ static ExprNode* FuncHiWord (void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static ExprNode* FuncIsMnemonic (void)
|
||||||
|
/* Handle the .ISMNEMONIC, .ISMNEM builtin function */
|
||||||
|
{
|
||||||
|
int Instr = -1;
|
||||||
|
|
||||||
|
/* Check for a macro or an instruction depending on UbiquitousIdents */
|
||||||
|
|
||||||
|
if (CurTok.Tok == TOK_IDENT) {
|
||||||
|
if (UbiquitousIdents) {
|
||||||
|
/* Macros CAN be instructions, so check for them first */
|
||||||
|
if (FindMacro (&CurTok.SVal) == 0) {
|
||||||
|
Instr = FindInstruction (&CurTok.SVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Macros and symbols may NOT use the names of instructions, so just check for the instruction */
|
||||||
|
Instr = FindInstruction (&CurTok.SVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Error ("Identifier expected.");
|
||||||
|
}
|
||||||
|
/* Skip the name */
|
||||||
|
NextTok ();
|
||||||
|
|
||||||
|
return GenLiteralExpr (Instr > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ExprNode* FuncLoByte (void)
|
ExprNode* FuncLoByte (void)
|
||||||
/* Handle the .LOBYTE builtin function */
|
/* Handle the .LOBYTE builtin function */
|
||||||
{
|
{
|
||||||
@@ -1094,8 +1116,8 @@ static ExprNode* Factor (void)
|
|||||||
N = Function (FuncDefined);
|
N = Function (FuncDefined);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOK_ISMNEMONIC:
|
case TOK_DEFINEDMACRO:
|
||||||
N = Function (FuncIsMnemonic);
|
N = Function (FuncDefinedMacro);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOK_HIBYTE:
|
case TOK_HIBYTE:
|
||||||
@@ -1106,6 +1128,10 @@ static ExprNode* Factor (void)
|
|||||||
N = Function (FuncHiWord);
|
N = Function (FuncHiWord);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TOK_ISMNEMONIC:
|
||||||
|
N = Function (FuncIsMnemonic);
|
||||||
|
break;
|
||||||
|
|
||||||
case TOK_LOBYTE:
|
case TOK_LOBYTE:
|
||||||
N = Function (FuncLoByte);
|
N = Function (FuncLoByte);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -83,3 +83,4 @@ unsigned char CComments = 0; /* Allow C like comments */
|
|||||||
unsigned char ForceRange = 0; /* Force values into expected range */
|
unsigned char ForceRange = 0; /* Force values into expected range */
|
||||||
unsigned char UnderlineInNumbers = 0; /* Allow underlines in numbers */
|
unsigned char UnderlineInNumbers = 0; /* Allow underlines in numbers */
|
||||||
unsigned char AddrSize = 0; /* Allow .ADDRSIZE function */
|
unsigned char AddrSize = 0; /* Allow .ADDRSIZE function */
|
||||||
|
|
||||||
|
|||||||
@@ -1989,6 +1989,7 @@ static CtrlDesc CtrlCmdTab [] = {
|
|||||||
{ ccNone, DoDebugInfo },
|
{ ccNone, DoDebugInfo },
|
||||||
{ ccNone, DoDefine },
|
{ ccNone, DoDefine },
|
||||||
{ ccNone, DoUnexpected }, /* .DEFINED */
|
{ ccNone, DoUnexpected }, /* .DEFINED */
|
||||||
|
{ ccNone, DoUnexpected }, /* .DEFINEDMACRO */
|
||||||
{ ccNone, DoDelMac },
|
{ ccNone, DoDelMac },
|
||||||
{ ccNone, DoDestructor },
|
{ ccNone, DoDestructor },
|
||||||
{ ccNone, DoDWord },
|
{ ccNone, DoDWord },
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ struct DotKeyword {
|
|||||||
{ ".DEF", TOK_DEFINED },
|
{ ".DEF", TOK_DEFINED },
|
||||||
{ ".DEFINE", TOK_DEFINE },
|
{ ".DEFINE", TOK_DEFINE },
|
||||||
{ ".DEFINED", TOK_DEFINED },
|
{ ".DEFINED", TOK_DEFINED },
|
||||||
|
{ ".DEFINEDMACRO", TOK_DEFINEDMACRO },
|
||||||
{ ".DELMAC", TOK_DELMAC },
|
{ ".DELMAC", TOK_DELMAC },
|
||||||
{ ".DELMACRO", TOK_DELMAC },
|
{ ".DELMACRO", TOK_DELMAC },
|
||||||
{ ".DESTRUCTOR", TOK_DESTRUCTOR },
|
{ ".DESTRUCTOR", TOK_DESTRUCTOR },
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ typedef enum token_t {
|
|||||||
TOK_DEBUGINFO,
|
TOK_DEBUGINFO,
|
||||||
TOK_DEFINE,
|
TOK_DEFINE,
|
||||||
TOK_DEFINED,
|
TOK_DEFINED,
|
||||||
|
TOK_DEFINEDMACRO,
|
||||||
TOK_DELMAC,
|
TOK_DELMAC,
|
||||||
TOK_DESTRUCTOR,
|
TOK_DESTRUCTOR,
|
||||||
TOK_DWORD,
|
TOK_DWORD,
|
||||||
|
|||||||
@@ -391,6 +391,12 @@ unsigned SizeOf (const Type* T)
|
|||||||
case T_VOID:
|
case T_VOID:
|
||||||
return 0; /* Assume voids have size zero */
|
return 0; /* Assume voids have size zero */
|
||||||
|
|
||||||
|
/* Beware: There's a chance that this triggers problems in other parts
|
||||||
|
of the compiler. The solution is to fix the callers, because calling
|
||||||
|
SizeOf() with a function type as argument is bad. */
|
||||||
|
case T_FUNC:
|
||||||
|
return 0; /* Size of function is unknown */
|
||||||
|
|
||||||
case T_SCHAR:
|
case T_SCHAR:
|
||||||
case T_UCHAR:
|
case T_UCHAR:
|
||||||
return SIZEOF_CHAR;
|
return SIZEOF_CHAR;
|
||||||
@@ -404,7 +410,6 @@ unsigned SizeOf (const Type* T)
|
|||||||
return SIZEOF_INT;
|
return SIZEOF_INT;
|
||||||
|
|
||||||
case T_PTR:
|
case T_PTR:
|
||||||
case T_FUNC: /* Maybe pointer to function */
|
|
||||||
return SIZEOF_PTR;
|
return SIZEOF_PTR;
|
||||||
|
|
||||||
case T_LONG:
|
case T_LONG:
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
/* Generator attributes */
|
/* Generator attributes */
|
||||||
#define GEN_NOPUSH 0x01 /* Don't push lhs */
|
#define GEN_NOPUSH 0x01 /* Don't push lhs */
|
||||||
#define GEN_COMM 0x02 /* Operator is commutative */
|
#define GEN_COMM 0x02 /* Operator is commutative */
|
||||||
|
#define GEN_NOFUNC 0x04 /* Not allowed for function pointers */
|
||||||
|
|
||||||
/* Map a generator function and its attributes to a token */
|
/* Map a generator function and its attributes to a token */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -2042,6 +2043,11 @@ static void hie_compare (const GenDesc* Ops, /* List of generators */
|
|||||||
Tok = CurTok.Tok;
|
Tok = CurTok.Tok;
|
||||||
NextToken ();
|
NextToken ();
|
||||||
|
|
||||||
|
/* If lhs is a function, convert it to pointer to function */
|
||||||
|
if (IsTypeFunc (Expr->Type)) {
|
||||||
|
Expr->Type = PointerTo (Expr->Type);
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the lhs on stack */
|
/* Get the lhs on stack */
|
||||||
GetCodePos (&Mark1);
|
GetCodePos (&Mark1);
|
||||||
ltype = TypeOf (Expr->Type);
|
ltype = TypeOf (Expr->Type);
|
||||||
@@ -2059,6 +2065,11 @@ static void hie_compare (const GenDesc* Ops, /* List of generators */
|
|||||||
/* Get the right hand side */
|
/* Get the right hand side */
|
||||||
MarkedExprWithCheck (hienext, &Expr2);
|
MarkedExprWithCheck (hienext, &Expr2);
|
||||||
|
|
||||||
|
/* If rhs is a function, convert it to pointer to function */
|
||||||
|
if (IsTypeFunc (Expr2.Type)) {
|
||||||
|
Expr2.Type = PointerTo (Expr2.Type);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for a constant expression */
|
/* Check for a constant expression */
|
||||||
rconst = (ED_IsConstAbs (&Expr2) && ED_CodeRangeIsEmpty (&Expr2));
|
rconst = (ED_IsConstAbs (&Expr2) && ED_CodeRangeIsEmpty (&Expr2));
|
||||||
if (!rconst) {
|
if (!rconst) {
|
||||||
@@ -2066,6 +2077,22 @@ static void hie_compare (const GenDesc* Ops, /* List of generators */
|
|||||||
LoadExpr (CF_NONE, &Expr2);
|
LoadExpr (CF_NONE, &Expr2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Some operations aren't allowed on function pointers */
|
||||||
|
if ((Gen->Flags & GEN_NOFUNC) != 0) {
|
||||||
|
/* Output only one message even if both sides are wrong */
|
||||||
|
if (IsTypeFuncPtr (Expr->Type)) {
|
||||||
|
Error ("Invalid left operand for relational operator");
|
||||||
|
/* Avoid further errors */
|
||||||
|
ED_MakeConstAbsInt (Expr, 0);
|
||||||
|
ED_MakeConstAbsInt (&Expr2, 0);
|
||||||
|
} else if (IsTypeFuncPtr (Expr2.Type)) {
|
||||||
|
Error ("Invalid right operand for relational operator");
|
||||||
|
/* Avoid further errors */
|
||||||
|
ED_MakeConstAbsInt (Expr, 0);
|
||||||
|
ED_MakeConstAbsInt (&Expr2, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Make sure, the types are compatible */
|
/* Make sure, the types are compatible */
|
||||||
if (IsClassInt (Expr->Type)) {
|
if (IsClassInt (Expr->Type)) {
|
||||||
if (!IsClassInt (Expr2.Type) && !(IsClassPtr(Expr2.Type) && ED_IsNullPtr(Expr))) {
|
if (!IsClassInt (Expr2.Type) && !(IsClassPtr(Expr2.Type) && ED_IsNullPtr(Expr))) {
|
||||||
@@ -2600,6 +2627,13 @@ static void parsesub (ExprDesc* Expr)
|
|||||||
int rscale; /* Scale factor for the result */
|
int rscale; /* Scale factor for the result */
|
||||||
|
|
||||||
|
|
||||||
|
/* lhs cannot be function or pointer to function */
|
||||||
|
if (IsTypeFunc (Expr->Type) || IsTypeFuncPtr (Expr->Type)) {
|
||||||
|
Error ("Invalid left operand for binary operator `-'");
|
||||||
|
/* Make it pointer to char to avoid further errors */
|
||||||
|
Expr->Type = type_uchar;
|
||||||
|
}
|
||||||
|
|
||||||
/* Skip the MINUS token */
|
/* Skip the MINUS token */
|
||||||
NextToken ();
|
NextToken ();
|
||||||
|
|
||||||
@@ -2616,6 +2650,13 @@ static void parsesub (ExprDesc* Expr)
|
|||||||
/* Parse the right hand side */
|
/* Parse the right hand side */
|
||||||
MarkedExprWithCheck (hie9, &Expr2);
|
MarkedExprWithCheck (hie9, &Expr2);
|
||||||
|
|
||||||
|
/* rhs cannot be function or pointer to function */
|
||||||
|
if (IsTypeFunc (Expr2.Type) || IsTypeFuncPtr (Expr2.Type)) {
|
||||||
|
Error ("Invalid right operand for binary operator `-'");
|
||||||
|
/* Make it pointer to char to avoid further errors */
|
||||||
|
Expr2.Type = type_uchar;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for a constant rhs expression */
|
/* Check for a constant rhs expression */
|
||||||
if (ED_IsConstAbs (&Expr2) && ED_CodeRangeIsEmpty (&Expr2)) {
|
if (ED_IsConstAbs (&Expr2) && ED_CodeRangeIsEmpty (&Expr2)) {
|
||||||
|
|
||||||
@@ -2775,10 +2816,10 @@ static void hie6 (ExprDesc* Expr)
|
|||||||
/* Handle greater-than type comparators */
|
/* Handle greater-than type comparators */
|
||||||
{
|
{
|
||||||
static const GenDesc hie6_ops [] = {
|
static const GenDesc hie6_ops [] = {
|
||||||
{ TOK_LT, GEN_NOPUSH, g_lt },
|
{ TOK_LT, GEN_NOPUSH | GEN_NOFUNC, g_lt },
|
||||||
{ TOK_LE, GEN_NOPUSH, g_le },
|
{ TOK_LE, GEN_NOPUSH | GEN_NOFUNC, g_le },
|
||||||
{ TOK_GE, GEN_NOPUSH, g_ge },
|
{ TOK_GE, GEN_NOPUSH | GEN_NOFUNC, g_ge },
|
||||||
{ TOK_GT, GEN_NOPUSH, g_gt },
|
{ TOK_GT, GEN_NOPUSH | GEN_NOFUNC, g_gt },
|
||||||
{ TOK_INVALID, 0, 0 }
|
{ TOK_INVALID, 0, 0 }
|
||||||
};
|
};
|
||||||
hie_compare (hie6_ops, Expr, ShiftExpr);
|
hie_compare (hie6_ops, Expr, ShiftExpr);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ else
|
|||||||
EXE :=
|
EXE :=
|
||||||
DEL = $(RM) $1
|
DEL = $(RM) $1
|
||||||
MKDIR = mkdir $1
|
MKDIR = mkdir $1
|
||||||
RMDIR = rmdir $1
|
RMDIR = $(RM) -r $1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
WORKDIR := ../testwrk
|
WORKDIR := ../testwrk
|
||||||
|
|||||||
26
test/err/cc65150311-1.c
Normal file
26
test/err/cc65150311-1.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
++p; /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-10.c
Normal file
26
test/err/cc65150311-10.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = &func - p; /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-11.c
Normal file
26
test/err/cc65150311-11.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = func - p; /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-2.c
Normal file
26
test/err/cc65150311-2.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = (p > &func); /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-3.c
Normal file
26
test/err/cc65150311-3.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = (p > func); /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-4.c
Normal file
26
test/err/cc65150311-4.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = func - func; /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-5.c
Normal file
26
test/err/cc65150311-5.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = func - &func; /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-6.c
Normal file
26
test/err/cc65150311-6.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = &func - func; /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-7.c
Normal file
26
test/err/cc65150311-7.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = &func - &func; /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-8.c
Normal file
26
test/err/cc65150311-8.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = p - &func; /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
test/err/cc65150311-9.c
Normal file
26
test/err/cc65150311-9.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
n = p - func; /* invalid C */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
38
test/val/cc65150311.c
Normal file
38
test/val/cc65150311.c
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
!!DESCRIPTION!! function pointer bugs
|
||||||
|
!!ORIGIN!! testsuite
|
||||||
|
!!LICENCE!! Public Domain
|
||||||
|
!!AUTHOR!! Greg
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
see: http://www.cc65.org/mailarchive/2015-03/11726.html
|
||||||
|
and: http://www.cc65.org/mailarchive/2015-03/11734.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int func(void) {return 0;}
|
||||||
|
static int (*p)(void);
|
||||||
|
static int n;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
p = func;
|
||||||
|
n = (p == &func);
|
||||||
|
n = (p == func);
|
||||||
|
|
||||||
|
/* the following are not valid C and should go into seperate tests that MUST fail */
|
||||||
|
/*
|
||||||
|
++p;
|
||||||
|
n = (p > &func);
|
||||||
|
n = (p > func);
|
||||||
|
n = func - func;
|
||||||
|
n = func - &func;
|
||||||
|
n = &func - func;
|
||||||
|
n = &func - &func;
|
||||||
|
n = p - &func;
|
||||||
|
n = p - func;
|
||||||
|
n = &func - p;
|
||||||
|
n = func - p;
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user