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

            Bug ID: 81270
           Summary: [concepts] ill-formed code with a constrained variable
                    declaration with multiple declarators with different
                    deduced types not rejected
           Product: gcc
           Version: c++-concepts
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tom at honermann dot net
                CC: andrew.n.sutton at gmail dot com, asutton at gcc dot gnu.org
  Target Milestone: ---

The Concepts TS (N4674) updates § 10.1.7.4 [dcl.spec.auto] paragraph 9
(paragraph 7 in the current WP) to state:

> If the init-declarator-list contains more than one init-declarator, they
> shall all form declarations of variables. The type of each declared
> variable is determined by placeholder type deduction (10.1.7.4.1), and if
> the type that replaces the declared variable type or return type is not
> the same in each deduction, the program is ill-formed.

gcc 7.1.0 fails to diagnose the following code that is ill-formed due to a
different type being deduced for each of the v1 and v2 declarators:

$ cat t.cpp 
template<typename> concept bool C = true;
C v1 = 1, v2 = nullptr;  // Ill-formed.
// Following code to demonstrate that the types of v1 and v2 are deduced
// to different types.
template<typename, typename> struct is_same {
  static constexpr bool value = false;
};
template<typename T> struct is_same<T,T> {
  static constexpr bool value = true;
};
static_assert(is_same<decltype(v1),int>::value);
static_assert(is_same<decltype(v2),decltype(nullptr)>::value);

$ g++ --version
g++ (GCC) 7.1.0
...

$ g++ -c -fconcepts t.cpp
<no error>

The expectation is that gcc reject the above code as it does if the declared
variable type C is replaced with auto:

$ cat t2.cpp 
auto v1 = 1, v2 = nullptr;

$ g++ -c -fconcepts t2.cpp
t2.cpp:1:1: error: inconsistent deduction for ‘auto’: ‘int’ and then
‘std::nullptr_t’
 auto v1 = 1, v2 = nullptr;
 ^~~~

Reply via email to