Log On
Embarcadero Home
Watch, Follow, &
Connect with Us
Share This
QualityCentral
Communities
Articles
Blogs
Resources
Downloads
Help
QualityCentral
Delphi-BCB
Compiler
Delphi
Anonymous Methods
BASM
Code Generation/Optimization
Error Recovery
Errors - Warnings
Exceptions
Execution
Finalization
Generics
Header Generation
Interaction with UI
Interfaces
Language
Linker
Make Logic
Memory Manager
OBJ Generation
OBJ Support
Other Compiler
Packages
RTTI
String Resources
TD Debug Info
Thread Local Storage
Version resilience
You are not logged in.
Help
Print
Public Report
Report From:
Delphi-BCB/Compiler/Delphi/Header Generation
[ Add a report in this area ]
Report #:
57613
Status:
Closed
pascal functions/implementations using UInt64 as argument can not be resolved by linker
Project:
C++Builder
Build #:
2288.42451
Version:
10.0
Submitted By:
Thomas Koos
Report Type:
Basic functionality failure
Date Reported:
1/30/2008 8:09:37 AM
Severity:
Serious / Highly visible problem
Last Updated:
9/9/2008 10:58:37 AM
Platform:
All versions
Internal Tracking #:
Resolution:
Duplicate
Resolved in Build:
:
12.0.2988.11541
Duplicate of:
57612
Voting and Rating
Overall Rating:
No Ratings Yet
0.00 out of 5
Total Votes:
None
Description
A pascal implemention using an argument type of UInt64 can not be called by any C/C++ source. The header generation generates a header using signed __int64 but the pascal compiler builds an intermediate with an unsigned __int64 signature. This fact lets the C++ linker fail to build the application.
See attached example.
See also QC #57612
Steps to Reproduce:
- create a pascal source containing method/function using UInt64 as argument
- use this pascal source in a C++ project (lib/project)
- try to call this...
See the attached example. It contains two cases:
1. Case (showing the error)
Build the project without any change will use the generated HPP file for the TestPas.pas source. This header uses __int64 and the compiler compiles it and builds an object intermediate calling the method using a (signed) __int64. But the pascal compiler correctly builds an object intermediate taking an unsigned __int64 as argument - so the linker will fail.
2. Case (proving the error source)
Comment out the preprocessor define of the ORIGINALHEADER symbol in front of the Mainform.cpp. This will include the attached, modified header file. The calling signature in the header file was changed manually to unsigned __int64. So the C++ compiler builds an object intermediate taking an unsigned __int64 argument, so the linker finds a match in the intermediates.
Workarounds
Do not use Int64 in any pascal source that can be called from C++
OR
Change the arguments manually from "__int64" to "unsigned __int64" on any generated header manually - every time after generation.
Attachment
QC57613.zip
Comments
None
View Your Reports
Search
Server Response from: ETNACODE01
Developer Tools
Blackfish SQL
C++Builder
Delphi
FireMonkey
Prism
InterBase
JBuilder
J Optimizer
HTML5 Builder
3rdRail & TurboRuby
Database Tools
Change Manager
DBArtisan
DB Optimizer
ER/Studio
Performance Center
Rapid SQL
Technical Articles
Tutorials
White Papers
Press Releases
Newsletters
Add Content (GetPublished)
Audio
Audio & Video
Video
Bugs & Suggestions (QualityCentral)
Discussion Forums
Examples (CodeCentral)
Tags
Technology Partners
Downloads
Free Trials
Registered User Downloads
Beta Programs
Add Content (GetPublished)
Articles
Blogs
Bugs & Suggestions (QualityCentral)
Discussion Forums
Examples (CodeCentral)
Member Services
About
Connect with Us