[clang] [libcxx] Reapply "[Clang] Implement resolution for CWG1835 (#92957, #98547)" (PR #100425)

Krystian Stasiowski via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 30 11:38:27 PDT 2024


sdkrystian wrote:

With these changes, we can now issue warnings for the missing `template` keyword in the _vast_ majority of cases:
```cpp
template<int I>
struct A { int x; };

template<int I, bool J>
struct B { int x; };

template<int I, typename T, int J>
struct C { int x; };

template<typename T>
struct D { int x; };

template<int I>
constexpr inline int V = I;

int y;

template<typename T, int I>
void f(T t) {
  t.A<0>::x;                            // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}
  t.A<int()>::x;                        // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}
  t.A<int(0)>::x;                       // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}
  t.A<int*()>::x;                       // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}
  t.A<static_cast<D<int>>(0)>::x;       // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}
  t.A<static_cast<const D<int>>(0)>::x; // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}
  t.B<1, true>::x;                      // expected-warning {{use 'template' keyword to treat 'B' as a dependent template name}}
  t.C<2, int, 4>::x;                    // expected-warning {{use 'template' keyword to treat 'C' as a dependent template name}}
  t.A<V<0>>::x;                         // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}
  t.B<1, V<1>>::x;                      // expected-warning {{use 'template' keyword to treat 'B' as a dependent template name}}
  t.C<V<2>, int, V<3>>::x;              // expected-warning {{use 'template' keyword to treat 'C' as a dependent template name}}
  t.A<1 && T::template f<0>()>::x;      // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}

  t.A<(1 > 2)>::x;           // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}
  t.A<(1 < 3)>::x;           // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}

  t.B<A<I>::x < int, 1>::x;  // expected-warning {{use 'template' keyword to treat 'x' as a dependent template name}}

  t.B<A<I>::x < 0, 1>::x;    // expected-error   {{no member named 'x' in the global namespace}}
                             // expected-error   {{missing 'template' keyword prior to dependent template name 'B'}}

  t.A<1 < 4>::x;             // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}

  t.A<I < 4>::x;             // expected-error   {{no member named 'x' in the global namespace}}
                             // expected-error   {{missing 'template' keyword prior to dependent template name 'A'}}

  t.A<I ? I < 4 : false>::x; // expected-warning {{use 'template' keyword to treat 'A' as a dependent template name}}

  t.A<1 > 4>::x;             // expected-error   {{no member named 'x' in the global namespace}}

  t.A<0>::y;                 // ok, parsed as '((t.A) < 0) > ::y'
}
```
Would like to get feedback from @AaronBallman, @cor3ntin, @hokein, and perhaps @zygoloid on this :). 

I highly doubt the [discussion on the reflector](https://lists.isocpp.org/core/2024/07/16028.php) will result in any mitigation mechanisms being added (see my reply [here](https://lists.isocpp.org/core/2024/07/16039.php)). If any action _is_ taken, the most I foresee would be applying it in C++23 & later. 

https://github.com/llvm/llvm-project/pull/100425


More information about the cfe-commits mailing list