<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57019>57019</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            False positive dependent template name
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          cloudhan
      </td>
    </tr>
</table>

<pre>
    The following code snippet fails with
```
<source>:31:5: error: use 'template' keyword to treat 'Ptr' as a dependent template name
  o.Ptr<T>();
    ^
    template 
1 error generated.
ASM generation compiler returned: 1
<source>:31:5: error: use 'template' keyword to treat 'Ptr' as a dependent template name
  o.Ptr<T>();
    ^
    template 
1 error generated.
Execution build compiler returned: 1
```

But if you compile with `-DFIX1` or `-DFIX2`, it will workaround the error and compile smoothly. I don't see the `o` object being something dependent on a template parameter. So the `o.Ptr<T>();` should be fine here. So I think this is a false positive (even MSVC can compile it!). I haven't passed the bar examination of C++, so please kindly point me out if I am wrong here.

https://godbolt.org/z/rv3nTzxvP

```cpp
#include <cstdint>
#include <vector>

class Var final {
public:
  template <typename T>
  T* Ptr() { return nullptr; }
};

class Context {
 public:
  Var* Output(const std::vector<int64_t>&) { return nullptr; }
};

template<typename T>
class Op {
public:
  void Compute(Context* ctx);
  int64_t v;
};

template<typename T>
void Op<T>::Compute(Context* ctx) {
#if   defined(FIX1)
  Var& o = *ctx->Output({this->v});
#elif defined(FIX2)
  auto& o = *ctx->Output({int64_t(this->v)});
#else
  auto& o = *ctx->Output({this->v});
#endif
  o.Ptr<T>();
}

int main() {
  Context ctx{};
  Op<float> o{};
  o.Compute(&ctx);
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdVU1v2zgQ_TXyZRBDH7EsHXRInATIoUiBBMXeFpQ4srihSYGknLi_foeUZTlpmt32WECS-Tnz5r2Zca35oXrqEFotpX4RaguN5ghWib5HBy0T0sKLcF0U30TxVZTHx2ecZhurB9NglN1G2VWW0GdFL6Ax2vjBYBGidO1w10vmkIbwjIcXbTg4Dc4gc37_qzN-i1lgwLFHxVE5mG6BYjscPQLopT-cbZ68z7SI0jLKrqdNgGh1O09OBsalZMQFW1RoaJkvx_Wrxy_TmtCKGNj1QqIBg24wCrkPJPmjIr59xWYIwdaDkPzzkN9pHr7XgwPRwkEP092QJUDHLm7u7v9KaADkeJqn_n66AeHonJRAfDwzowdFrFD6jSiZOiEBu9PadfKwhHvgWnlGwSKG02RLB_v1P9g4qNHnrdU7dJ0fzXRSfGympGeGWHVolvCoT4Y-JJeM204PxExNtSEUQocGw7178F6e_deC8PK1TJLmvbbCib0Xv8A9Kvjy-G0DDTvlE8UepQk58CF1jI6EoHpmLY4s1MwAvrKdUGMi6hY2UXodng0FCL1ERq6eheLyQB4FxbhD0KMY98B28GI0URDQnuvVOddbEjVK7-jZal5r6ZbabGn2nV6zz9TT99f91_NLJ-Wbvj-upJlQjRyoRRBnjXWcIHjmPtjdkza-JG7PTTaSwoVvFCixyiRE62Mm90MtReMRHnN5zuRs4w6kKGkHTydzQOP0CkIZedW8pWP2ghqk7L2q17R6c3RPg6lqzqFstHL46mYg8AMSQutdPQyuH0jCotHKUjI6XyT0THFuiIr88u9AR5r_FqRT0_gw5BHwQ_8JaXstOIW0I6DUeYpjcB59417fNo4jWtjPGH4RT3D20E_FE8j4xPcM2-dJS82Koy8tTodDxyB454znoEn7G6qnKzJwQS5OCpAlX35-be9RnwVGtlGS9Te20zPbbHD6v4xPSqbF7IYsfODJ4q_Y_Qy04qL9Hx1_zp7wDR2ACTUXwWRjSmxPPq2eaQujaK3UzCcr6B_29XLWkWJ6lzszhKk_LLBK8jyOk1URpwteZbzMSrZwwkms7t62x5_82S0GI6t3XYr-UIZ6Se2TJlLup5-L3mjf-GkqrB3Q0mC1jpNy0VV5XiTrJmUlz9u6ZLhOizZPiiJp10mGZbGQrCbVqmhFPTVV-ALBBI2j1c1CVGmcpnERl3GWUTjLJrksVmXZrLO6qPOSR5cxEt1y6XH49rkwVYBUD1tLm1JYZ-dNqlexVYjBHdmnHOm0qRqpB94xtQi-q4D9X8dU0Ms">