[LLVMbugs] [Bug 6108] New: Broken __mode__ (__DI__) on 64bit platforms
bugzilla-daemon at cs.uiuc.edu
bugzilla-daemon at cs.uiuc.edu
Thu Jan 21 18:42:34 PST 2010
http://llvm.org/bugs/show_bug.cgi?id=6108
Summary: Broken __mode__ (__DI__) on 64bit platforms
Product: new-bugs
Version: trunk
Platform: PC
OS/Version: All
Status: NEW
Severity: normal
Priority: P2
Component: new bugs
AssignedTo: unassignedbugs at nondot.org
ReportedBy: chandlerc at gmail.com
CC: llvmbugs at cs.uiuc.edu, zhanyong.wan at gmail.com
An integer with this attribute in Clang will not be the same fundamental type
as 'long int', and instead will be 'long long'.
Testcase:
% cat test.cpp
typedef int int64_t __attribute__ ((__mode__ (__DI__)));
typedef long int intptr_t;
void f(int64_t* x) { (void)x; }
int test(intptr_t* y) { f(y); }
% clang++ -fsyntax-only -m64 test.cpp
test.cpp:4:25: error: no matching function for call to 'f'
int test(intptr_t* y) { f(y); }
^
test.cpp:3:6: note: candidate function not viable: no known conversion from
'intptr_t *' to
'int64_t *' for 1st argument
void f(int64_t* x) { (void)x; }
^
2 diagnostics generated.
Useful program showing what is actually happening, and also highlighting *yet
another* aspect of this bug:
% cat ull.cpp
#include <iostream>
#include <typeinfo>
typedef int my_int64_t __attribute__ ((__mode__ (__DI__)));
typedef long int my_intptr_t;
int main(void) {
std::cout << typeid(long int).name() << "\n";
std::cout << typeid(int __attribute__ ((__mode__ (__DI__)))).name() << "\n";
std::cout << typeid(long long).name() << "\n";
std::cout << typeid(my_int64_t).name() << "\n";
std::cout << typeid(my_intptr_t).name() << "\n";
return 0;
}
% clang++ -m64 ull.cpp -o ull; ./ull
l
i
x
x
l
The typeid seems to change based on whether or not its seen through a typedef.
=[
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list