Here is the g++ commandline:

g++ -MMD -MF
obj/third_party/angle/libGLESv2/entry_points_gles_ext_autogen.o.d
-DLIBGLESV2_IMPLEMENTATION -DUSE_UDEV -DUSE_AURA=1 -DUSE_GLIB=1
-DUSE_NSS_CERTS=1 -DUSE_X11=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
-D_FORTIFY_SOURCE=2 -DCOMPONENT_BUILD -DNDEBUG -DNVALGRIND
-DDYNAMIC_ANNOTATIONS_ENABLED=0 -DANGLE_IS_64_BIT_CPU
-DGL_APICALL=__attribute__\(\(visibility\(\"default\"\)\)\)
-DGL_API=__attribute__\(\(visibility\(\"default\"\)\)\)
-DGL_GLES_PROTOTYPES=1 -DEGL_EGL_PROTOTYPES=1 -DGL_GLEXT_PROTOTYPES
-DEGL_EGLEXT_PROTOTYPES -DANGLE_CAPTURE_ENABLED=0 -DLIBANGLE_IMPLEMENTATION
-DANGLE_USE_X11 -DANGLE_ENABLE_OPENGL -DANGLE_ENABLE_OPENGL_NULL
-DANGLE_ENABLE_NULL -DANGLE_ENABLE_VULKAN -DANGLE_ENABLE_SWIFTSHADER
-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1 -DANGLE_ENABLE_VULKAN
-DANGLE_ENABLE_SWIFTSHADER -DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1
-I../../third_party/angle/include -I../../third_party/angle/src -Igen/angle
-I../../third_party/angle/src/common/third_party/base
-I../../third_party/angle/include -I../../third_party/angle/include
-I../../third_party/angle/src -I../../third_party/angle/include
-fno-strict-aliasing --param=ssp-buffer-size=4 -fstack-protector
-funwind-tables -fPIC -pipe -pthread -m64 -march=x86-64
-Wno-builtin-macro-redefined -D__DATE__= -D__TIME__= -D__TIMESTAMP__= -Wall
-Wno-unused-local-typedefs -Wno-maybe-uninitialized
-Wno-deprecated-declarations -Wno-comments -Wno-packed-not-aligned
-Wno-missing-field-initializers -Wno-unused-parameter -O2 -fno-ident
-fdata-sections -ffunction-sections -fno-omit-frame-pointer -g0
-fvisibility=hidden -std=gnu++14 -Wno-narrowing -Wno-class-memaccess
-fno-exceptions -fno-rtti -fvisibility-inlines-hidden -c
../../third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp -o
obj/third_party/angle/libGLESv2/entry_points_gles_ext_autogen.o

The error with gcc 10:

In file included from ../../third_party/angle/src/libANGLE/Context.h:18,
                 from
../../third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp:13:
../../third_party/angle/src/libANGLE/angletypes.h:427:2:   in 'constexpr'
expansion of 'angle::PackedEnumMap<gl::ComponentType, unsigned
int>(std::initializer_list<std::pair<gl::ComponentType, unsigned int>
>{((const std::pair<gl::ComponentType, unsigned int>*)(& const
std::pair<gl::ComponentType, unsigned int> [3]{std::pair<gl::ComponentType,
unsigned int>{gl::ComponentType::Float, 65537},
std::pair<gl::ComponentType, unsigned int>{gl::ComponentType::Int, 1},
std::pair<gl::ComponentType, unsigned int>{gl::ComponentType::UnsignedInt,
65536}})), 3})'
../../third_party/angle/src/common/PackedEnums.h:89:72: error: modifying a
const object '(unsigned int&)(&(&(const
Storage&)(&((angle::PackedEnumMap<gl::ComponentType, unsigned
int>*)this)->angle::PackedEnumMap<gl::ComponentType, unsigned
int>::mPrivateData))->std::array<unsigned int,
4>::operator[](((std::array<unsigned int,
4>::size_type)((angle::PackedEnumMap<gl::ComponentType, unsigned
int>::UnderlyingType)it->std::pair<gl::ComponentType, unsigned
int>::first))))' is not allowed in a constant expression
   88 |             const_cast<T &>(const_cast<const Storage &>(
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   89 |
mPrivateData)[static_cast<UnderlyingType>(it->first)]) = it->second;
      |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
In file included from ../../third_party/angle/src/libANGLE/Caps.h:12,
                 from ../../third_party/angle/src/libANGLE/Context.h:20,
                 from
../../third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp:13:
../../third_party/angle/src/libANGLE/angletypes.h:427:2: note: originally
declared 'const' here
  427 | }};
      |  ^
In file included from ../../third_party/angle/src/libANGLE/Context.h:18,
                 from
../../third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp:13:
../../third_party/angle/src/libANGLE/Context.inl.h:36:2:   in 'constexpr'
expansion of 'angle::PackedEnumMap<gl::PrimitiveMode,
int>(std::initializer_list<std::pair<gl::PrimitiveMode, int> >{((const
std::pair<gl::PrimitiveMode, int>*)(& const std::pair<gl::PrimitiveMode,
int> [11]{std::pair<gl::PrimitiveMode, int>{gl::PrimitiveMode::Points, 1},
std::pair<gl::PrimitiveMode, int>{gl::PrimitiveMode::Lines, 2},
std::pair<gl::PrimitiveMode, int>{gl::PrimitiveMode::LineLoop, 2},
std::pair<gl::PrimitiveMode, int>{gl::PrimitiveMode::LineStrip, 2},
std::pair<gl::PrimitiveMode, int>{gl::PrimitiveMode::Triangles, 3},
std::pair<gl::PrimitiveMode, int>{gl::PrimitiveMode::TriangleStrip, 3},
std::pair<gl::PrimitiveMode, int>{gl::PrimitiveMode::TriangleFan, 3},
std::pair<gl::PrimitiveMode, int>{gl::PrimitiveMode::LinesAdjacency, 2},
std::pair<gl::PrimitiveMode, int>{gl::PrimitiveMode::LineStripAdjacency,
2}, std::pair<gl::PrimitiveMode,
int>{gl::PrimitiveMode::TrianglesAdjacency, 3},
std::pair<gl::PrimitiveMode,
int>{gl::PrimitiveMode::TriangleStripAdjacency, 3}})), 11})'
../../third_party/angle/src/common/PackedEnums.h:89:72: error: modifying a
const object '(int&)(&(&(const
Storage&)(&((angle::PackedEnumMap<gl::PrimitiveMode,
int>*)this)->angle::PackedEnumMap<gl::PrimitiveMode,
int>::mPrivateData))->std::array<int, 14>::operator[](((std::array<int,
14>::size_type)((angle::PackedEnumMap<gl::PrimitiveMode,
int>::UnderlyingType)it->std::pair<gl::PrimitiveMode, int>::first))))' is
not allowed in a constant expression
   88 |             const_cast<T &>(const_cast<const Storage &>(
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   89 |
mPrivateData)[static_cast<UnderlyingType>(it->first)]) = it->second;
      |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
In file included from
../../third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp:14:
../../third_party/angle/src/libANGLE/Context.inl.h:36:2: note: originally
declared 'const' here
   36 | }};
      |  ^

As requested, preprocessed sources (gcc -E) from gcc 9.2.0
and gcc-10.0.1-0.8.fc32.x86_64 are available here:

https://spot.fedorapeople.org/entry_points_gles_ext_autogen.E.gcc9
https://spot.fedorapeople.org/entry_points_gles_ext_autogen.E.gcc10

I think this failure is occurring because of this reference in the GCC10
changelog:

* G++ can now detect modifying constant objects in constexpr evaluation
(which is undefined behavior).

I understand that it is undefined behavior in the C++14 standard, but given
that it is explicitly permitted in C++17 (and that it was implicitly
permitted with this hack in C++14), it feels like this is a regression.
Nevertheless, I would appreciate any help in resolving this so that we have
a working Chromium in Fedora 32.

Thanks in advance,
Tom




On Mon, Mar 2, 2020 at 9:16 AM Jakub Jelinek <ja...@redhat.com> wrote:

> On Mon, Mar 02, 2020 at 08:57:46AM -0500, Tom Callaway wrote:
> > Wait, I know that $TOPIC is scary, come back.
> >
> > Chromium has this chunk of code (in
> > third_party/angle/src/common/PackedEnums.h):
> >
> >              // This horrible const_cast pattern is necessary to work
> > around a constexpr limitation.
> >              // See https://stackoverflow.com/q/34199774/ . Note that it
> > should be fixed with C++17.
> >              const_cast<T &>(const_cast<const Storage &>(
> >                 mPrivateData)[static_cast<UnderlyingType>(it->first)]) =
> > it->second;
> >
> > This code built with gcc9, but with gcc10 it no longer works.
>
> Is it now rejected with some error (which)?
> Generally, such code snippets aren't really very useful because they lack
> context, so what we really need is full preprocessed sources + g++ command
> line options used to reproduce it, if gcc9 built and gcc10 doesn't, best
> preprocessed sources from both gcc 9 and gcc 10, so that we can find out if
> it is a header change or compiler change that matters.
>
>         Jakub
> _______________________________________________
> devel mailing list -- devel@lists.fedoraproject.org
> To unsubscribe send an email to devel-le...@lists.fedoraproject.org
> Fedora Code of Conduct:
> https://docs.fedoraproject.org/en-US/project/code-of-conduct/
> List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
> List Archives:
> https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org
>
_______________________________________________
devel mailing list -- devel@lists.fedoraproject.org
To unsubscribe send an email to devel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org

Reply via email to