c++ - clang vs gcc in abstract class handling in compile time -


one of these issues of nlohmann/json opensource library drew attention.

i have minimal reproduction of case does not compile under few version of desktop gcc (4.8, 4.9, tried 5+) compiles mac clang , android ndk's gcc 4.9

#include <limits>  struct base {     virtual void foo() = 0; };  int main() {     (void)numeric_limits<base>::is_signed; } 

gcc trying instantiate std::numeric_limits base class instead of derived:

/usr/include/c++/4.8/limits: in instantiation of 'struct std::numeric_limits<base>': main.cpp:11:94:   required here /usr/include/c++/4.8/limits:309:7: error: cannot allocate object of abstract type 'base' min() _glibcxx_use_noexcept { return _tp(); } 

i'm not quite sure if known compiler bug (in case of failure) or feature/relaxed rule (in case of success)

i've tried work around std::is_abstract not help, looks 'short-circuit' evaluation not happening in enable_if , error stays same

my question not how fix gcc weather compiler bug or code bug


edit: added "more minimal" example without standard library dependency:

template <typename t> struct foo {   static t bar();   static constexpr bool value = true; };  struct abstract {   virtual ~abstract() = 0; };  int main() {   (void) foo<abstract>::value; } 

compiles on clang 3.9.0, gcc 7 snapshot emits error invalid return type of foo<abstract>::bar.


edit2: i'm bit surprised initial question edited without consent, not aware allows :) though think brought bit of confusion , wrong answers, because text , code not connected anymore

no, not bug. bad test.

description

the difference between gcc , clang in case way process template class functions:

  • gcc: of them in once.
  • clang: 1 has been used.

in our first example, function min() doesn't called, , therefore, clang doesn't has problem it. gcc, parses functions , find out min() invalid.

in second example, same happens: bar() doesn't called , therefore clang ok being ill-formed. again, gcc, have problem it, although hasn't been used anywhere in program.

a test

saying bad not enough, let's fix it: example fail both gcc , clang same error (invalid abstract return type ‘base’ or allocating object of abstract class type 'base').

#include <limits>  struct base {     virtual void foo() = 0; };  int main() {     (void)std::numeric_limits<base>::min(); } 

Comments

Popular posts from this blog

java - SSE Emitter : Manage timeouts and complete() -

jquery - uncaught exception: DataTables Editor - remote hosting of code not allowed -

java - How to resolve error - package com.squareup.okhttp3 doesn't exist? -