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

            Bug ID: 67217
           Summary: [concepts] Constraints are ignored when specializing
                    union templates
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: Casey at Carter dot net
  Target Milestone: ---

r226833 incorrectly compiles this program without diagnostics:

template <class T>
  requires __is_same_as(T, double)
union A {};

int main() { A<int>{}; }

despite that int does not satisfy the constraints of A. Changing the expression
__is_same_as(T, double) to true, false, 42, or (new T) has no effect - the
program compiles without diagnostics.

Compiling *this* program, however:

template <class>
union B {};

template <class T>
  requires false
union B<T> {};

int main() {
  B<int>{};
}

incorrectly produces diagnostics:

~/gcc6-r226833/bin/g++ -std=gnu++1z foo.cpp -c
foo.cpp: In function ‘int main()’:
foo.cpp:9:10: error: ambiguous template instantiation for ‘union B<int>’
   B<int>{};
          ^
foo.cpp:6:7: note: candidates are: template<class T> union B<T> [with T = int]
 union B<T> {};
       ^
foo.cpp:6:12: note:                 template<class T> union B<T> [with T = int]
 union B<T> {};
            ^
foo.cpp:6:13: note:                 template<class T> union B<T> [with T = int]
 union B<T> {};
             ^
foo.cpp:9:10: error: invalid use of incomplete type ‘union B<int>’
   B<int>{};
          ^
foo.cpp:2:7: note: declaration of ‘union B<int>’
 union B {};
       ^

It would appear that constraints are not being checked on union templates.

Reply via email to