mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2024-06-09 16:29:30 +00:00
Reverse order of parameters for pascal function pointer types.
The parameters of the underlying function type were not being reversed when applying the "pascal" qualifier to a function pointer type. This resulted in the parameters not being in the expected order when a call was made using such a function pointer. This could result in spurious errors in some cases or inappropriate parameter conversions in others. This fixes #75.
This commit is contained in:
parent
3acf5844c2
commit
b1bc840ec8
17
Parser.pas
17
Parser.pas
|
@ -3945,21 +3945,8 @@ else {if not isFunction then} begin
|
||||||
Error(142);
|
Error(142);
|
||||||
if not SkipDeclarator then
|
if not SkipDeclarator then
|
||||||
repeat
|
repeat
|
||||||
if isPascal then begin
|
if isPascal then
|
||||||
tp := variable^.itype;
|
variable^.itype := MakePascalType(variable^.itype);
|
||||||
while tp <> nil do
|
|
||||||
case tp^.kind of
|
|
||||||
scalarType,
|
|
||||||
enumType,
|
|
||||||
enumConst,
|
|
||||||
definedType,
|
|
||||||
structType,
|
|
||||||
unionType: begin tp := nil; Error(94); end;
|
|
||||||
arrayType: tp := tp^.atype;
|
|
||||||
pointerType: tp := tp^.pType;
|
|
||||||
functionType: begin tp^.isPascal := true; tp := nil; end;
|
|
||||||
end; {case}
|
|
||||||
end; {if}
|
|
||||||
if isInline then
|
if isInline then
|
||||||
Error(119);
|
Error(119);
|
||||||
if isNoreturn then
|
if isNoreturn then
|
||||||
|
|
66
Symbol.pas
66
Symbol.pas
|
@ -172,6 +172,16 @@ function LabelToDisp (lab: integer): integer; extern;
|
||||||
{ lab - label number }
|
{ lab - label number }
|
||||||
|
|
||||||
|
|
||||||
|
function MakePascalType (origType: typePtr): typePtr;
|
||||||
|
|
||||||
|
{ make a version of a type with the pascal qualifier applied }
|
||||||
|
{ }
|
||||||
|
{ parameters: }
|
||||||
|
{ origType - the original type }
|
||||||
|
{ }
|
||||||
|
{ returns: pointer to the pascal-qualified type }
|
||||||
|
|
||||||
|
|
||||||
function MakeQualifiedType (origType: typePtr; qualifiers: typeQualifierSet):
|
function MakeQualifiedType (origType: typePtr; qualifiers: typeQualifierSet):
|
||||||
typePtr;
|
typePtr;
|
||||||
|
|
||||||
|
@ -1684,6 +1694,62 @@ constCharPtr^.qualifiers := [tqConst];
|
||||||
end; {InitSymbol}
|
end; {InitSymbol}
|
||||||
|
|
||||||
|
|
||||||
|
function MakePascalType {origType: typePtr): typePtr};
|
||||||
|
|
||||||
|
{ make a version of a type with the pascal qualifier applied }
|
||||||
|
{ }
|
||||||
|
{ parameters: }
|
||||||
|
{ origType - the original type }
|
||||||
|
{ }
|
||||||
|
{ returns: pointer to the pascal-qualified type }
|
||||||
|
|
||||||
|
var
|
||||||
|
pascalType: typePtr; {the modified type}
|
||||||
|
tp,tp2: typePtr; {work pointers}
|
||||||
|
p1,p2,p3: parameterPtr; {for reversing prototyped parameters}
|
||||||
|
|
||||||
|
begin {MakePascalType}
|
||||||
|
pascalType := pointer(Malloc(sizeof(typeRecord)));
|
||||||
|
pascalType^ := origType^;
|
||||||
|
MakePascalType := pascalType;
|
||||||
|
tp := pascalType;
|
||||||
|
while tp <> nil do
|
||||||
|
case tp^.kind of
|
||||||
|
arrayType,
|
||||||
|
pointerType: begin
|
||||||
|
tp2 := pointer(Malloc(sizeof(typeRecord)));
|
||||||
|
tp2^ := tp^.pType^;
|
||||||
|
tp^.pType := tp2;
|
||||||
|
tp := tp2;
|
||||||
|
end;
|
||||||
|
functionType: begin
|
||||||
|
if not tp^.isPascal then begin
|
||||||
|
{reverse the parameter list}
|
||||||
|
p1 := tp^.parameterList;
|
||||||
|
if p1 <> nil then begin
|
||||||
|
p2 := nil;
|
||||||
|
while p1 <> nil do begin
|
||||||
|
p3 := pointer(Malloc(sizeof(parameterRecord)));
|
||||||
|
p3^ := p1^;
|
||||||
|
p1 := p1^.next;
|
||||||
|
p3^.next := p2;
|
||||||
|
p2 := p3;
|
||||||
|
end; {while}
|
||||||
|
tp^.parameterList := p2;
|
||||||
|
end; {if}
|
||||||
|
tp^.isPascal := true;
|
||||||
|
end; {if}
|
||||||
|
tp := nil;
|
||||||
|
end;
|
||||||
|
otherwise: begin
|
||||||
|
Error(94);
|
||||||
|
MakePascalType := origType;
|
||||||
|
tp := nil;
|
||||||
|
end;
|
||||||
|
end; {case}
|
||||||
|
end; {MakePascalType}
|
||||||
|
|
||||||
|
|
||||||
function MakeQualifiedType {origType: typePtr; qualifiers: typeQualifierSet):
|
function MakeQualifiedType {origType: typePtr; qualifiers: typeQualifierSet):
|
||||||
typePtr};
|
typePtr};
|
||||||
|
|
||||||
|
|
4
cc.notes
4
cc.notes
|
@ -1699,6 +1699,10 @@ int foo(int[42]);
|
||||||
|
|
||||||
173. sizeof could give the wrong value if the type contained a nested use of a type name within an array length expression, e.g. sizeof(short[(long)50]).
|
173. sizeof could give the wrong value if the type contained a nested use of a type name within an array length expression, e.g. sizeof(short[(long)50]).
|
||||||
|
|
||||||
|
174. Certain calls using a pascal-qualified function pointer would not work properly. They could cause either incorrect code generation or spurious compiler errors, depending on the parameter types.
|
||||||
|
|
||||||
|
(Chris Vavruska)
|
||||||
|
|
||||||
-- Bugs from C 2.1.0 that have been fixed -----------------------------------
|
-- Bugs from C 2.1.0 that have been fixed -----------------------------------
|
||||||
|
|
||||||
1. In some situations, fread() reread the first 1K or so of the file.
|
1. In some situations, fread() reread the first 1K or so of the file.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user