zq@eecg.toronto.edu (Qing Zheng) (03/25/91)
The following could be the buggs of AT&T C++ 2.1 on Sun SPARC (SunOs 4.1)
1) return type conflict for alloca()
---- C++ header file alloca.h --------
/*ident "@(#)C++env:incl-master/proto-headers/alloca.h 1.2" */
#ifndef __ALLOCA_H
#define __ALLOCA_H
/* @(#)alloca.h 1.4 88/08/19 SMI */
#ifndef _alloca_h
#define _alloca_h
#if defined(sparc)
# define alloca(x) __builtin_alloca(x)
#endif
#endif /*!_alloca_h*/
extern "C" {
void *__builtin_alloca(int);
} /* ^^^^^ the return type is void* */
#endif
---- C++ header file malloc.h ------
/*ident "@(#)C++env:incl-master/proto-headers/malloc.h 1.1" */
#ifndef __MALLOC_H
#define __MALLOC_H
......
extern "C" {
char *malloc(size_t);
void free(void*);
void cfree(void*);
char *realloc(void*, size_t);
char *calloc(unsigned, size_t);
int mallopt(int, int);
struct mallinfo mallinfo(int);
char *memalign(unsigned, size_t);
char *valloc(size_t);
int malloc_debug(int);
int malloc_verify();
char *alloca(int);
} /* ^^^^^^ here the return type is char* */
#endif
2) Since in the SunOS 4.1 header file /usr/include/unistd.h already
constains some external function declaration such as
...
extern char *getlogin(/* void */);
...
these declarations will also be contained in the C++ header file unistd.h
after being expanded during 'make scratch'. The correct declaration should
be :
extern "C" {
...
char *getlogin();
...
}
instead of
extern char *getlogin(/* void */);
which is a C++ function declaration. Actually this function is already
declared in C++ header file stdlib.h as
extern "C" {
...
char *getlogin();
...
}
Any idea of how to fix these buggs properly ?
Thanks in advance.
----Qing