https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79605

            Bug ID: 79605
           Summary: attribute [[noreturn]] accepted in explicit
                    instantiation directives
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

G++ accepts __attribute__((noreturn)) in explicit instantiation derectives of
function templates where it is applied to the implicit declaration of the
specialization of the template.

However, the C++ 17 attribute [[noreturn]] "may be applied to the declarator-id
in a function declaration" and is not explicitly permitted to be applied in
other contexts, such as in explicit instantiation derectives.  Other compilers,
including Clang 5.0 and EDG eccp 4.11 reject the attribute there but GCC
silently accepts it even in pedantic mode.  For conformance, GCC should
diagnose the attribute there as well.


$ cat u.C && gcc -S -Wall -Wunused -Wpedantic u.C
template <class T>
T f () { throw; }

template [[noreturn]] int f<int> ();


template <class T>
int g () { throw; }

template __attribute__ ((noreturn)) int g<int> ();


int f1 ()
{
  f<int>();   // not diagnosed (bug)
}

int g1 ()
{
  g<int>();   // accepted (okay)
}

Reply via email to