Bug #20964
closedOracle Developer Studio 12.5 on Solaris failed to compile "prism/extension.c", line 499: internal compiler error: Wasted space
Description
Oracle Developer Studio 12.5 and 12.6 on Solaris 10 failed to compile prism/extension.c with the following error:
cc -errtags=yes -xO4 -xtarget=sparc64xplus -m64 -xatomic=gcc -g -erroff=E_STATEMENT_NOT_REACHED -erroff=E_INIT_SIGN_EXTEND -erroff=E_INIT_DOES_NOT_FIT -erroff=E_INITIALIZATION_TYPE_MISMATCH -DRUBY_EXPORT -I. -I.ext/include/sparc64-solaris2.10 -I../ruby.devel/include -I../ruby.devel -I../ruby.devel/prism -I../ruby.devel/enc/unicode/15.0.0 -D_XOPEN_SOURCE=600 -I/usr/local/64/lib/libffi-3.0.10/include -I/usr/local/64/include -o prism/extension.o -c ../ruby.devel/prism/extension.c
"../ruby.devel/prism/extension.c", line 499: internal compiler error: Wasted space
cc: acomp failed for ../ruby.devel/prism/extension.c
make: *** [prism/extension.o] Error 2
The line 499 in prism/extension.c is located at the end of parser_errors() function.
It seems that the error message internal compiler error: Wasted space
strongly suggests the compiler's bug.
Changing optimization level did not solve the error.
After some trial and error, I found that the following patch dismisses the error.
--- a/prism/extension.c
+++ b/prism/extension.c
@@ -464,11 +464,11 @@ parser_errors(pm_parser_t *parser, rb_encoding *encoding, VALUE source) {
pm_diagnostic_t *error;
for (error = (pm_diagnostic_t *) parser->error_list.head; error != NULL; error = (pm_diagnostic_t *) error->node.next) {
- VALUE location_argv[] = {
- source,
- LONG2FIX(error->location.start - parser->start),
- LONG2FIX(error->location.end - error->location.start)
- };
+ VALUE location_argv[3];
+
+ location_argv[0] = source;
+ location_argv[1] = LONG2FIX(error->location.start - parser->start);
+ location_argv[2] = LONG2FIX(error->location.end - error->location.start);
VALUE level = Qnil;
switch (error->level) {
@@ -485,12 +485,12 @@ parser_errors(pm_parser_t *parser, rb_encoding *encoding, VALUE source) {
rb_raise(rb_eRuntimeError, "Unknown level: %" PRIu8, error->level);
}
- VALUE error_argv[] = {
- ID2SYM(rb_intern(pm_diagnostic_id_human(error->diag_id))),
- rb_enc_str_new_cstr(error->message, encoding),
- rb_class_new_instance(3, location_argv, rb_cPrismLocation),
- level
- };
+ VALUE error_argv[4];
+
+ error_argv[0] = ID2SYM(rb_intern(pm_diagnostic_id_human(error->diag_id)));
+ error_argv[1] = rb_enc_str_new_cstr(error->message, encoding);
+ error_argv[2] = rb_class_new_instance(3, location_argv, rb_cPrismLocation);
+ error_argv[3] = level;
rb_ary_push(errors, rb_class_new_instance(4, error_argv, rb_cPrismParseError));
}
@@ -507,11 +507,11 @@ parser_warnings(pm_parser_t *parser, rb_encoding *encoding, VALUE source) {
pm_diagnostic_t *warning;
for (warning = (pm_diagnostic_t *) parser->warning_list.head; warning != NULL; warning = (pm_diagnostic_t *) warning->node.next) {
- VALUE location_argv[] = {
- source,
- LONG2FIX(warning->location.start - parser->start),
- LONG2FIX(warning->location.end - warning->location.start)
- };
+ VALUE location_argv[3];
+
+ location_argv[0] = source;
+ location_argv[1] = LONG2FIX(warning->location.start - parser->start);
+ location_argv[2] = LONG2FIX(warning->location.end - warning->location.start);
VALUE level = Qnil;
switch (warning->level) {
@@ -525,12 +525,12 @@ parser_warnings(pm_parser_t *parser, rb_encoding *encoding, VALUE source) {
rb_raise(rb_eRuntimeError, "Unknown level: %" PRIu8, warning->level);
}
- VALUE warning_argv[] = {
- ID2SYM(rb_intern(pm_diagnostic_id_human(warning->diag_id))),
- rb_enc_str_new_cstr(warning->message, encoding),
- rb_class_new_instance(3, location_argv, rb_cPrismLocation),
- level
- };
+ VALUE warning_argv[4];
+
+ warning_argv[0] = ID2SYM(rb_intern(pm_diagnostic_id_human(warning->diag_id)));
+ warning_argv[1] = rb_enc_str_new_cstr(warning->message, encoding);
+ warning_argv[2] = rb_class_new_instance(3, location_argv, rb_cPrismLocation);
+ warning_argv[3] = level;
rb_ary_push(warnings, rb_class_new_instance(4, warning_argv, rb_cPrismParseWarning));
}
However, I don't like to add the patch because this change significantly decreases maintainability of code.
I also think that the compiler's bug should be fixed in the compiler side and such dirty workaround should not be included.
P.S.
GCC 7.5.0 on Solaris 10 can compile the original code (without the workaround patch) with no errors.
Therefore, it seems that this is not Solaris OS problem but the problem of Oracle Developer Studio 12.5/12.6 compiler.
Updated by ngoto (Naohisa Goto) about 12 hours ago
- Status changed from Open to Third Party's Issue
Changed to Third Party's Issue
I'm hoping someone who have support contract of Oracle Developer Studio will contact Oracle support to solve this compile error.