Laurent GUERBY <[email protected]> writes:
> What is the way forward: fixing in some way the Ada Makefile? Or doing
> search and replace in case of keyword/identifier conflict? If
> search/replace, do AdaCore people have an opinion on the best way
> to proceed to avoid maintenance issues in the various trees? (eg: commit
> of those trivial patches directly on trunk or on AdaCore tree then
> trunk?)
I can't answer that--it's up to the Ada maintainers.
> I don't know much about C++/C compatibilities and the way to solve
> them choosen on the gcc-in-cxx branch, is there a document somewhere?
No. In some cases the warnings given by -Wc++-compat will be more
helpful.
> Next error is related to enum in for loop:
>
> g++ -c -g -g -DIN_GCC -W -Wall -Wwrite-strings -Wcast-qual -fno-common
> -DHAVE_CONFIG_H -I.. -I. -Iada -I../../gcc/gcc -I../../gcc/gcc/ada
> -I../../gcc/gcc/../include -I../../gcc/gcc/../libcpp/include
> -I/opt/cfarm/gmp-4.2.4//include -I/opt/cfarm/mpfr-2.4.1//include
> -I../../gcc/gcc/../libdecnumber -I../../gcc/gcc/../libdecnumber/bid
> -I../libdecnumber ../../gcc/gcc/ada/gcc-interface/misc.c -o ada/misc.o
> ../../gcc/gcc/ada/gcc-interface/misc.c: In function 'void
> enumerate_modes(void (*)(int, int, int, int, int, int, unsigned int))':
> ../../gcc/gcc/ada/gcc-interface/misc.c:734: error: invalid conversion from
> 'int' to 'machine_mode'
> ../../gcc/gcc/ada/gcc-interface/misc.c:734: error: no 'operator++(int)'
> declared for postfix '++', trying prefix operator instead
> ../../gcc/gcc/ada/gcc-interface/misc.c:734: error: no match for 'operator++'
> in '++i'
In the C/C++ common subset you can not write loops in which the index
variable has enum type. Loops like these must be written as something
along the lines of
int iloop;
for (iloop = 0; iloop < NUM_MACHINE_MODES; iloop++)
{
enum machine_mode i = (enum machine_mode) iloop;
...
}
> Another kind of error on struct declarations:
>
> <<
> g++ -c -g -g -DIN_GCC -W -Wall -Wwrite-strings -Wcast-qual -fno-common
> -DHAVE_CONFIG_H -I.. -I. -Iada -I../../gcc/gcc -I../../gcc/gcc/ada
> -I../../gcc/gcc/../include -I../../gcc/gcc/../libcpp/include
> -I/opt/cfarm/gmp-4.2.4//include -I/opt/cfarm/mpfr-2.4.1//include
> -I../../gcc/gcc/../libdecnumber -I../../gcc/gcc/../libdecnumber/bid
> -I../libdecnumber ../../gcc/gcc/ada/gcc-interface/trans.c -o ada/trans.o
> ../../gcc/gcc/ada/gcc-interface/trans.c:111: error: conflicting declaration
> 'typedef struct parm_attr* parm_attr'
> ../../gcc/gcc/ada/gcc-interface/trans.c:103: error: 'struct parm_attr' has a
> previous declaration as 'struct parm_attr'
In C++, if a typedef and a struct tag have the same name, they must name
the same type. I've been addressing these issues by consistently
renaming the struct with a "_d" suffix. See, e.g., struct
alias_set_entry_d and alias_set_entry in alias.c.
> Last error is on void* arithmetic:
>
> <<
> g++ -c -g -g -DIN_GCC -W -Wall -Wwrite-strings -Wcast-qual -fno-common
> -Wno-error -DHAVE_CONFIG_H -I. -Iada -I../../gcc/gcc -I../../gcc/gcc/ada
> -I../../gcc/gcc/../include -I../../gcc/gcc/../libcpp/include
> -I/opt/cfarm/gmp-4.2.4//include -I/opt/cfarm/mpfr-2.4.1//include
> -I../../gcc/gcc/../libdecnumber -I../../gcc/gcc/../libdecnumber/bid
> -I../libdecnumber \
> -I. -Iada -I../../gcc/gcc -I../../gcc/gcc/ada
> -I../../gcc/gcc/../include -I../../gcc/gcc/../libcpp/include
> -I/opt/cfarm/gmp-4.2.4//include -I/opt/cfarm/mpfr-2.4.1//include
> -I../../gcc/gcc/../libdecnumber -I../../gcc/gcc/../libdecnumber/bid
> -I../libdecnumber -fno-omit-frame-pointer ../../gcc/gcc/ada/tracebak.c -o
> ada/tracebak.o
> In file included from ../../gcc/gcc/ada/tracebak.c:396:
> ../../gcc/gcc/ada/tb-gcc.c: In function '_Unwind_Reason_Code
> trace_callback(_Unwind_Context*, uw_data_t*)':
> ../../gcc/gcc/ada/tb-gcc.c:86: error: pointer of type 'void *' used in
> arithmetic
Here pc has type "void *", but the code computes "pc + PC_ADJUST". This
is not permitted in C either, and is actually a gcc extension. The fix
is to change pc to "char *".
Ian