Project

General

Profile

Actions

Bug #20964

closed

Oracle Developer Studio 12.5 on Solaris failed to compile "prism/extension.c", line 499: internal compiler error: Wasted space

Added by ngoto (Naohisa Goto) about 14 hours ago. Updated about 14 hours ago.

Status:
Third Party's Issue
Assignee:
-
Target version:
-
[ruby-core:120300]

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.

Actions

Also available in: Atom PDF

Like0
Like0