# Error building julia; bug in latest gcc (9.0.0 experimental), or in Julia's gc code?

**URL:** https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253
**Category:** General Usage
**Created:** [May 30, 2018, 3:12am UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253 "2018-05-30T03:12:54Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)
#### Post date: [May 30, 2018, 3:12am UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/1 "2018-05-30T03:12:54Z")

</div>

Hi,  
I’ve been getting the following error when trying to build Julia (v0.6.2 / v0.6.3 / master):

```julia
In file included from /home/chris/Documents/prog/julia-reg/src/codegen.cpp:105:
/home/chris/Documents/prog/julia-reg/src/cgutils.cpp: In function ‘void _hook_call(jl_value_t*, std::array<_jl_value_t*, N>)’:
/home/chris/Documents/prog/julia-reg/src/julia.h:696:55: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&(((void**)rts_var)[-2])
                                                       ^
/home/chris/Documents/prog/julia-reg/src/cgutils.cpp:112:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(argv, N+1);

```

While using:

```julia
$ gcc-trunk -v
Using built-in specs.
COLLECT_GCC=gcc-trunk
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/9.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-trunk/configure --program-suffix=-trunk : (reconfigured) ../gcc-trunk/configure --program-suffix=-trunk --enable-languages=c,c++,fortran,lto,objc --no-create --no-recursion
Thread model: posix
gcc version 9.0.0 20180524 (experimental) (GCC)

```

The code that produces the error has been the same for ages, and compiles fine under gcc 8.1.0 (the latest release) and earlier.  
I’d have to do a lot of digging to find out whether it’s a bug in gcc 9, or that it uncovered an old bug here.

Obviously I can checkout gcc 8.1 again if I just wanted to have Julia, but thought I should post here, in case someone from Julia wants to know, or if I should file a gcc bug report.

For reference, here’s the full output:

```julia
$ make CC=gcc-trunk CXX=g++-trunk FC=gfortran-trunk -j32
    CC src/codegen.o
In file included from /home/chris/Documents/prog/julia/usr/include/llvm/Target/TargetSubtargetInfo.h:18,
                 from /home/chris/Documents/prog/julia/src/codegen.cpp:39:
/home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/SchedulerRegistry.h: In constructor ‘llvm::RegisterScheduler::RegisterScheduler(const char*, const char*, llvm::RegisterScheduler::FunctionPassCtor)’:
/home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/SchedulerRegistry.h:42:52: warning: cast between incompatible function types from ‘llvm::RegisterScheduler::FunctionPassCtor’ {aka ‘llvm::ScheduleDAGSDNodes* (*)(llvm::SelectionDAGISel*, llvm::CodeGenOpt::Level)’} to ‘llvm::MachinePassCtor’ {aka ‘void* (*)()’} [-Wcast-function-type]
   : MachinePassRegistryNode(N, D, (MachinePassCtor)C)
                                                    ^
In file included from /home/chris/Documents/prog/julia/src/codegen.cpp:120:
/home/chris/Documents/prog/julia/src/cgutils.cpp: In function ‘void _hook_call(jl_value_t*, std::array<_jl_value_t*, N>)’:
/home/chris/Documents/prog/julia/src/julia.h:627:55: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&(((void**)rts_var)[-2])
                                                       ^
/home/chris/Documents/prog/julia/src/cgutils.cpp:50:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(argv, N+1);
     ^ ~~~~~~~~~~~~~
In file included from /home/chris/Documents/prog/julia/usr/include/llvm/Support/Allocator.h:24,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/StringMap.h:18,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Support/Host.h:17,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/Hashing.h:49,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/ArrayRef.h:13,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Support/CommandLine.h:23,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/MachinePassRegistry.h:22,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/SchedulerRegistry.h:18,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Target/TargetSubtargetInfo.h:18,
                 from /home/chris/Documents/prog/julia/src/codegen.cpp:39:
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h: In instantiation of ‘void llvm::SmallVectorTemplateBase<T, true>::push_back(const T&) [with T = std::pair<std::pair<llvm::MCSection*, const llvm::MCExpr*>, std::pair<llvm::MCSection*, const llvm::MCExpr*> >]’:
/home/chris/Documents/prog/julia/usr/include/llvm/MC/MCStreamer.h:321:66: required from here
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h:305:11: warning: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘struct std::pair<std::pair<llvm::MCSection*, const llvm::MCExpr*>, std::pair<llvm::MCSection*, const llvm::MCExpr*> >’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
     memcpy(this->end(), &Elt, sizeof(T));
     ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/c++/9.0.0/bits/stl_algobase.h:64,
                 from /usr/local/include/c++/9.0.0/bits/char_traits.h:39,
                 from /usr/local/include/c++/9.0.0/string:40,
                 from /home/chris/Documents/prog/julia/src/codegen.cpp:26:
/usr/local/include/c++/9.0.0/bits/stl_pair.h:198:12: note: ‘struct std::pair<std::pair<llvm::MCSection*, const llvm::MCExpr*>, std::pair<llvm::MCSection*, const llvm::MCExpr*> >’ declared here
     struct pair
            ^~~~
In file included from /home/chris/Documents/prog/julia/usr/include/llvm/Support/Allocator.h:24,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/StringMap.h:18,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Support/Host.h:17,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/Hashing.h:49,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/ArrayRef.h:13,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Support/CommandLine.h:23,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/MachinePassRegistry.h:22,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/SchedulerRegistry.h:18,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Target/TargetSubtargetInfo.h:18,
                 from /home/chris/Documents/prog/julia/src/codegen.cpp:39:
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h: In instantiation of ‘void llvm::SmallVectorTemplateBase<T, true>::push_back(const T&) [with T = std::pair<_jl_value_t**, llvm::GlobalVariable*>]’:
/home/chris/Documents/prog/julia/src/codegen.cpp:6331:53: required from here
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h:305:11: warning: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘struct std::pair<_jl_value_t**, llvm::GlobalVariable*>’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
     memcpy(this->end(), &Elt, sizeof(T));
     ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/c++/9.0.0/bits/stl_algobase.h:64,
                 from /usr/local/include/c++/9.0.0/bits/char_traits.h:39,
                 from /usr/local/include/c++/9.0.0/string:40,
                 from /home/chris/Documents/prog/julia/src/codegen.cpp:26:
/usr/local/include/c++/9.0.0/bits/stl_pair.h:198:12: note: ‘struct std::pair<_jl_value_t**, llvm::GlobalVariable*>’ declared here
     struct pair
            ^~~~
In file included from /home/chris/Documents/prog/julia/usr/include/llvm/Support/Allocator.h:24,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/StringMap.h:18,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Support/Host.h:17,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/Hashing.h:49,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/ArrayRef.h:13,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Support/CommandLine.h:23,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/MachinePassRegistry.h:22,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/SchedulerRegistry.h:18,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Target/TargetSubtargetInfo.h:18,
                 from /home/chris/Documents/prog/julia/src/codegen.cpp:39:
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h: In instantiation of ‘void llvm::SmallVectorTemplateBase<T, true>::push_back(const T&) [with T = std::pair<void*, long unsigned int>]’:
/home/chris/Documents/prog/julia/usr/include/llvm/Support/Allocator.h:238:33: required from ‘void* llvm::BumpPtrAllocatorImpl<AllocatorT, SlabSize, SizeThreshold>::Allocate(size_t, size_t) [with AllocatorT = llvm::MallocAllocator; long unsigned int SlabSize = 4096; long unsigned int SizeThreshold = 4096; size_t = long unsigned int]’
/home/chris/Documents/prog/julia/usr/include/llvm/MC/MCContext.h:575:44: required from here
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h:305:11: warning: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘struct std::pair<void*, long unsigned int>’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
     memcpy(this->end(), &Elt, sizeof(T));
     ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/c++/9.0.0/bits/stl_algobase.h:64,
                 from /usr/local/include/c++/9.0.0/bits/char_traits.h:39,
                 from /usr/local/include/c++/9.0.0/string:40,
                 from /home/chris/Documents/prog/julia/src/codegen.cpp:26:
/usr/local/include/c++/9.0.0/bits/stl_pair.h:198:12: note: ‘struct std::pair<void*, long unsigned int>’ declared here
     struct pair
            ^~~~
In file included from /home/chris/Documents/prog/julia/usr/include/llvm/Support/Allocator.h:24,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/StringMap.h:18,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Support/Host.h:17,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/Hashing.h:49,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/ADT/ArrayRef.h:13,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Support/CommandLine.h:23,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/MachinePassRegistry.h:22,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/CodeGen/SchedulerRegistry.h:18,
                 from /home/chris/Documents/prog/julia/usr/include/llvm/Target/TargetSubtargetInfo.h:18,
                 from /home/chris/Documents/prog/julia/src/codegen.cpp:39:
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h: In instantiation of ‘static void llvm::SmallVectorTemplateBase<T, true>::uninitialized_copy(T1*, T1*, T2*, typename std::enable_if<std::is_same<typename std::remove_const<T1>::type, T2>::value>::type*) [with T1 = const std::pair<const llvm::MCSymbol*, const llvm::MCSymbol*>; T2 = std::pair<const llvm::MCSymbol*, const llvm::MCSymbol*>; T = std::pair<const llvm::MCSymbol*, const llvm::MCSymbol*>; typename std::enable_if<std::is_same<typename std::remove_const<T1>::type, T2>::value>::type = void]’:
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h:396:5: required from ‘void llvm::SmallVectorImpl<T>::append(in_iter, in_iter) [with in_iter = const std::pair<const llvm::MCSymbol*, const llvm::MCSymbol*>*; T = std::pair<const llvm::MCSymbol*, const llvm::MCSymbol*>]’
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h:855:5: required from ‘llvm::SmallVector<T, N>::SmallVector(ItTy, ItTy) [with ItTy = const std::pair<const llvm::MCSymbol*, const llvm::MCSymbol*>*; T = std::pair<const llvm::MCSymbol*, const llvm::MCSymbol*>; unsigned int N = 2]’
/home/chris/Documents/prog/julia/usr/include/llvm/MC/MCFragment.h:547:42: required from here
/home/chris/Documents/prog/julia/usr/include/llvm/ADT/SmallVector.h:293:13: warning: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘struct std::pair<const llvm::MCSymbol*, const llvm::MCSymbol*>’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
       memcpy(Dest, I, (E - I) * sizeof(T));
       ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/c++/9.0.0/bits/stl_algobase.h:64,
                 from /usr/local/include/c++/9.0.0/bits/char_traits.h:39,
                 from /usr/local/include/c++/9.0.0/string:40,
                 from /home/chris/Documents/prog/julia/src/codegen.cpp:26:
/usr/local/include/c++/9.0.0/bits/stl_pair.h:198:12: note: ‘struct std::pair<const llvm::MCSymbol*, const llvm::MCSymbol*>’ declared here
     struct pair
            ^~~~
Makefile:144: recipe for target 'codegen.o' failed
make[1]: *** [codegen.o] Error 1
Makefile:94: recipe for target 'julia-src-release' failed
make: *** [julia-src-release] Error 2

```

---

<div class="post-metadata">

### Author: ![Keno](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/keno/32/285_2.png) [@Keno](https://discourse.julialang.org/u/Keno)
#### Post date: [May 31, 2018, 12:17am UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/2 "2018-05-31T00:17:59Z")

</div>

Try removing one of the extra pairs of parentheses after the `&`. I don’t have the C standard in front of me, but I imagine that that might turn an lvalue into an rvalue.

---

<div class="post-metadata">

### Author: ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)
#### Post date: [May 31, 2018, 6:21am UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/3 "2018-05-31T06:21:12Z")

</div>

No luck. Removing the outer most parenthesis results in the same error, while removing those around `rts_var`:

```nohighlight
jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])

```

results in that error appearing in many places throughout the build:

```julia
    CC src/jloptions.o
In file included from /home/chris/Documents/prog/julia/src/jltypes.c:14:
/home/chris/Documents/prog/julia/src/jltypes.c: In function ‘jl_type_union’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/jltypes.c:405:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(temp, nt+1);
     ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/jltypes.c: In function ‘jl_apply_type2’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/jltypes.c:836:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(args, 2);
     ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/jltypes.c: In function ‘check_datatype_parameters’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/jltypes.c:953:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(bounds, np*2);
     ^ ~~~~~~~~~~~~~
In file included from /home/chris/Documents/prog/julia/src/gf.c:14:
/home/chris/Documents/prog/julia/src/gf.c: In function ‘jl_type_infer’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/gf.c:247:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(fargs, 3);
     ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/jltypes.c: In function ‘inst_tuple_w_’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/jltypes.c:1317:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(iparams, onstack ? ntp : 1);
     ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/jltypes.c: In function ‘inst_type_w_’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/jltypes.c:1417:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(iparams, ntp);
     ^ ~~~~~~~~~~~~~
In file included from /home/chris/Documents/prog/julia/src/builtins.c:24:
/home/chris/Documents/prog/julia/src/builtins.c: In function ‘jl_f__apply’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/builtins.c:372:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(newargs, onstack ? n : 1);
     ^ ~~~~~~~~~~~~~
In file included from /home/chris/Documents/prog/julia/src/jlapi.c:14:
/home/chris/Documents/prog/julia/src/jlapi.c: In function ‘jl_call’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/jlapi.c:140:9: note: in expansion of macro ‘JL_GC_PUSHARGS’
         JL_GC_PUSHARGS(argv, nargs+1);
         ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/jlapi.c: In function ‘jl_call1’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/jlapi.c:180:9: note: in expansion of macro ‘JL_GC_PUSHARGS’
         JL_GC_PUSHARGS(argv, 2);
         ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/gf.c: In function ‘arg_type_tuple’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/gf.c:1499:9: note: in expansion of macro ‘JL_GC_PUSHARGS’
         JL_GC_PUSHARGS(types, nargs);
         ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/jlapi.c: In function ‘jl_call2’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/jlapi.c:200:9: note: in expansion of macro ‘JL_GC_PUSHARGS’
         JL_GC_PUSHARGS(argv, 3);
         ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/jlapi.c: In function ‘jl_call3’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/jlapi.c:221:9: note: in expansion of macro ‘JL_GC_PUSHARGS’
         JL_GC_PUSHARGS(argv, 4);
         ^ ~~~~~~~~~~~~~
In file included from /home/chris/Documents/prog/julia/src/precompile.c:11:
/home/chris/Documents/prog/julia/src/precompile.c: In function ‘_compile_all_tvar_union’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/precompile.c:111:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(env, 2 * tvarslen);
     ^ ~~~~~~~~~~~~~
In file included from /home/chris/Documents/prog/julia/src/interpreter.c:9:
/home/chris/Documents/prog/julia/src/interpreter.c: In function ‘do_call’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/interpreter.c:71:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(argv, nargs);
     ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/interpreter.c: In function ‘do_invoke’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/interpreter.c:83:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(argv, nargs - 1);
     ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/sys.c: In function ‘jl_readuntil’:
/home/chris/Documents/prog/julia/src/sys.c:284:17: warning: unused variable ‘truncret’ [-Wunused-variable]
             int truncret = ios_trunc(&dest, n); // it should always be possible to truncate dest
                 ^ ~~~~~~~
Makefile:140: recipe for target 'jlapi.o' failed
make[1]: *** [jlapi.o] Error 1
make[1]: *** Waiting for unfinished jobs....
/home/chris/Documents/prog/julia/src/interpreter.c: In function ‘jl_interpret_call’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/interpreter.c:659:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(locals, jl_source_nslots(src) + jl_source_nssavalues(src) + 2);
     ^ ~~~~~~~~~~~~~
/home/chris/Documents/prog/julia/src/interpreter.c: In function ‘jl_interpret_toplevel_thunk’:
/home/chris/Documents/prog/julia/src/julia.h:627:32: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var[-2])
                                ^
/home/chris/Documents/prog/julia/src/interpreter.c:685:5: note: in expansion of macro ‘JL_GC_PUSHARGS’
     JL_GC_PUSHARGS(locals, jl_source_nslots(src) + jl_source_nssavalues(src));
     ^ ~~~~~~~~~~~~~
Makefile:140: recipe for target 'precompile.o' failed
make[1]: *** [precompile.o] Error 1
Makefile:140: recipe for target 'jltypes.o' failed
make[1]: *** [jltypes.o] Error 1
Makefile:140: recipe for target 'gf.o' failed
make[1]: *** [gf.o] Error 1
Makefile:140: recipe for target 'interpreter.o' failed
make[1]: *** [interpreter.o] Error 1
Makefile:140: recipe for target 'builtins.o' failed
make[1]: *** [builtins.o] Error 1
Makefile:94: recipe for target 'julia-src-release' failed
make: *** [julia-src-release] Error 2

```

Implying that the line as it currently is:

```julia
jl_pgcstack = (jl_gcframe_t*)&(((void**)rts_var)[-2])

```

is fine in for all those files, but something goes wrong while trying to build codegen.

EDIT:  
I did just confirm that it does still build with gcc 8.1.0. I am only having issues with gcc 9.0.0.

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [May 31, 2018, 11:19am UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/4 "2018-05-31T11:19:59Z")

</div>

Remove the inner most cast

---

<div class="post-metadata">

### Author: ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)
#### Post date: [May 31, 2018, 11:44am UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/5 "2018-05-31T11:44:51Z")

</div>

That worked:

```julia
#define JL_GC_PUSHARGS(rts_var,n) \
  rts_var = ((jl_value_t**)alloca(((n)+2)*sizeof(jl_value_t*)))+2; \
  ((void**)rts_var)[-2] = (void*)(((size_t)(n))<<1); \
  ((void**)rts_var)[-1] = jl_pgcstack; \
  memset((void*)rts_var, 0, (n)*sizeof(jl_value_t*)); \
  jl_pgcstack = (jl_gcframe_t*)&((rts_var)[-2])
// jl_pgcstack = (jl_gcframe_t*)&(((void**)rts_var)[-2])

```

What does casting to `void**` do – and what are the consequences of removing it?

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [May 31, 2018, 11:57am UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/6 "2018-05-31T11:57:55Z")

</div>

> [@Elrod](#):
>
> jl\_pgcstack = (jl\_gcframe\_t\*)&((rts\_var)[-2])

If you don’t want to change any requirement on the caller, you can use.

`jl_pgcstack = (jl_gcframe_t*)((void**)(rts_var) - 2)`

(Or `void***` if you want to code to be exactly the same as before…)

---

<div class="post-metadata">

### Author: ![Keno](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/keno/32/285_2.png) [@Keno](https://discourse.julialang.org/u/Keno)
#### Post date: [May 31, 2018, 12:15pm UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/7 "2018-05-31T12:15:28Z")

</div>

> [@Elrod](#):
>
> jl\_pgcstack = (jl\_gcframe\_t\*)&((void\*\*)rts\_var[-2])

That’s not the one I meant. I meant:

```julia
jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var)[-2]

```

---

<div class="post-metadata">

### Author: ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)
#### Post date: [May 31, 2018, 1:10pm UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/8 "2018-05-31T13:10:10Z")

</div>

Sorry I wasn’t clear – I did try that first, but it resulted in the same error as I had earlier:

```julia
/home/chris/Documents/prog/julia-reg/src/julia.h:696:55: error: lvalue required as unary ‘&’ operand
   jl_pgcstack = (jl_gcframe_t*)&((void**)rts_var)[-2]
                                                     ^

```

So out of curiosity I tried what I showed that post (removing parenthesis around `rts_var`), and that time got the error in many different places, much earlier.

Yuyichao – I assume it is better not to change requirements? That suggestion also worked without issue:

```julia
jl_pgcstack = (jl_gcframe_t*)((void**)(rts_var) - 2)

```

---

<div class="post-metadata">

### Author: ![Keno](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/keno/32/285_2.png) [@Keno](https://discourse.julialang.org/u/Keno)
#### Post date: [May 31, 2018, 1:11pm UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/9 "2018-05-31T13:11:33Z")

</div>

> [@Elrod](#):
>
> Sorry I wasn’t clear – I did try that first, but it resulted in the same error as I had earlier:

In that case, that sounds like a gcc bug to me. The C standard is fairly clear that a `&` and `[]` need to semantically cancel.

---

<div class="post-metadata">

### Author: ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)
#### Post date: [June 1, 2018, 3:41pm UTC](https://discourse.julialang.org/t/error-building-julia-bug-in-latest-gcc-9-0-0-experimental-or-in-julias-gc-code/11253/10 "2018-06-01T15:41:51Z")

</div>

Okay – think I should say something on their mailing list?
