<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJylVdtu2zgQ_Rr5ZWBBIuM4ftCDr4CBoiiaXb_T1MhmQVMqSSXNfv0OKcnxJUUR1KB14ZDDM-fMjPZ1-VYkfA1SePDofCqbJslWSTZPHrN-xFephXMwh2S66Caadq-VTPi8ewWQtXEefzUWlPFwQL81PmFPCZt1prAVLPrWGsgSvqD3VX8UPfDebXf1eGq08AgJXwZvXwPGl1qVEWTvNUA5u-iujKuqxAqe_10u18_P3WzcV7VG0r45-GHrsAO1w_uFHWSKlz3e7zClqoawIyC-9OllxAR3eFi8x_gRr7ev7AGIanNI2ILGWRMYy4GZXiQ-zzldwh_Q2tqGB1PDSXh5VOYQA_GqNlDVlvTVGnxN4Uw7BqefxA-QTNbJ9DPjFu8j_RnvYHoMdymIyTLofBZcHUxtsQxWZV6EJkUopyjTlNdvY9egVJXCEoQ9tCek1AjRnXc3wooTerQh0K_nKD-dTvDhLzAQzXnHOCW5QUt-y_SP6sF4dZWUN7pvPTjEkwN_pEpUFSi6OiLKjC1WaNFIIumtwYQtexsSO204HITrKkxQaMJ_6H9f1xq-7GgHrqlE193emDQ0dsopvxN2hVKfcz-sIxrn63BkN9UvCbO71VVVAKRp-s4dBRBZzXerMXFNqfVPxB6IDhPKfR-iejfcOBy8bIKkdzaA7-ha7VOHUcDpIiBaQlwdjtiaEn-FmR1aR2UQtL3K5_Dr25G3LV5ZrhKhX_TcSonO0WG7G08Xq29oB9gOUt7L-IrwqqgsiVuvTItA1QCVUPp3IgLMv0UJowAXAM50DznRC7U1KpCzNVUdDoxKXtB0yU547DS4C7wSoUNehDugGpUFL2d8Jkai9cfaFj_dUZj_-JSPWquLo_eNCwnGNjQOyh_bfSrrE71o_TLcxo2tf6AknBvlXItE8GbCZ0-T0bHIZ2zyUD3le5ZNWJ4LjnKSPZAV9zPEio202FP7LpIJlRvrKo_PK0uEUo-mqWSyGv09EFWwjIXBcrrxx1Qiz8tKzBgiy56YTB4yPJFwafCT1vYwskV0uW8PjoxaOe_ejfQlpTaHGHETQk-9DYsNOaBipiZdYtmGPDlibAAhXz5qca8UyMVXd-j3o4i-iND_B5gDRlA>53985</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Failed to deduce the non-type template parameter with constexpr function
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:frontend
      </td>
    </tr>

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

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

<pre>
    > cat test.cpp
```
class A {
public:
  constexpr int getInt() const { return 0; }
};

template <int N> void test() {}

#ifdef SUCCESS
void func(A t) {
#else
void func(const A &t) {
#endif
  test<t.getInt()>();
}
```
```
$ clang++ test.cpp -c
test.cpp:13:3: error: no matching function for call to 'test'
  test<t.getInt()>();
  ^~~~~~~~~~~~~~~~
test.cpp:6:23: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'N'
template <int N> void test() {}
                      ^
1 error generated.
$ clang++ test.cpp -c -DSUCCESS
```
It seems that if it is non-reference type, it is evaluated as constant at
```
bool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) {
  ...
    if (!VD->getType()->isReferenceType()) {
    if (Frame) {
      Result.set({VD, Frame->Index, Version});
      return true;
    }
    return Success(VD);
  }
  ```
  If it is reference type, we will continue and fail at
```
  APValue *V;
  if (!evaluateVarDeclInit(Info, E, VD, Frame, Version, V))
    return false;
  ```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyVVduO4ygQ_RryUorlmFwf_JCrFGk1Wk3v5p3gcsKKYC_g7un5-imwnc6lR6OOCDYUFHXOqcLHqnjPGd-CFB48Op_IumbphqVLNk27FodSC-dgCWy2aifq5qiVZHzZDgFkZZzHH7UFZTyc0O-NZ9mcZYvWFLaCRd9YAynjKxpvuqPohXdu297jpdbCIzC-Dt6-hRhfK1XEIDuvIZSri7bPuCoLLOHl3_V6-_LSzsZ9ZWMk7VuC77f2O1A7fF7Yhkx4s-nzDlOosocdA-Jrn9wipnD7l9UHxs94fRxmYyCqzYllK2pXTWAoe2Y6kfhyxKkLf0BrKxteTAUX4eVZmVME4lVloKws6as1-IrgzFoGZ1-MH4BNtmz2lfYY75T-GW_D9BieUhCTRdD5Krg6mcpiEazKvApNilBOUaYpr9-HrkapSoUFCHtqLkipEdBdd9fCigt6tAHotyvKL6cTfPoLDETzqGWcktygJb9F8kf1YLi5S8oH3fceHOLFgT9TJaoSFPWOiDJDiyVaNJJIeq-RZevOhsROEw4H4doKEwRN-E_9H6tKw18H2oFbKtFtuzcmDbWDcsofhN2g1NfcD-uIxuU2HNlOdUvC7GFzVxUASZJ8cEcAIqujw2ZIXFNq_RNjD0SHCeW-96g-DA8Oey-7IOmTDeA7ukb7xGEUcLYKEa0hrg5H7E2BP8LMAa2jMgja3uVz-HXXkbcN3lnuEqFb9NJIic7RYYcHTzerH2gH2PdSPsv4hvCmqCyJW69Mg0DVAKVQ-nciAiz_jhJGAW4CuNLd50Qn1N6oQM7elFU4MCp5Q9MtO-G11eAJeCnCDXkDt49qUOS8WPCFGHiqTsx3FDulI10zBRZNQHrGmMIB8WdF-qb8-ea70d9Yg8bq_Ox97UJ6ZjtqJ1rZHBNZXWig9Wv_GNa2-g8lodwp5xokeXYTvphPBue8nKSj-YLPxyn1Iy7kuJzJ8XQyLaaLeTEqB1oc6fLP2YSKNWvrli9LS3LQDU9TbLIZqDxLs9CyET34NJHIR0UpFhlils4zycYpXgh4EsJJKnsa2DxGdmxOjoxaOe8-jPQVpSsOMZ5K_kXjz5XN_3dnYX7yGR9EGHnE8AtgFDCR">