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

    <tr>
        <th>Summary</th>
        <td>
            Clang crash on overcomplicated conversion function templates
        </td>
    </tr>

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

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

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

<pre>
    This code:
```
// custom definitions of standard library types, reduces preprocessed file size
// i couldn't get creduce to work, but standard library headers (<type_traist> and <utility>)
// produced the same crash, just with a bigger preprocessed file
struct false_type
{
    static constexpr bool value = false;
};

struct true_type
{
    static constexpr bool value = true;
};

template <bool condition, typename T = void>
struct enable_if
{};

template <typename T>
struct enable_if<true, T>
{
    using type = T;
};

// lifted from cppreference.com/w/cpp/types/add_reference
template <typename T> struct type_identity { using type = T; };

namespace detail {
template <typename T> auto try_add_rvalue_reference(int) -> type_identity<T&&>;
template <typename T> auto try_add_rvalue_reference(...) -> type_identity<T>;
} // namespace detail

template <typename T>
struct add_rvalue_reference : decltype(detail::try_add_rvalue_reference<T>(0))
{};

// lifted from cppreference.com/w/cpp/utility/declval
template <typename T>
constexpr bool always_false = false;

template <typename T>
typename add_rvalue_reference<T>::type declval() noexcept 
{
    static_assert(always_false<T>, "declval not allowed in evaluated context");
}

template <typename From, typename To, typename = To>
struct is_static_castable : false_type
{};

template <typename From, typename To>
struct is_static_castable<From, To,
    decltype(static_cast<To>(declval<From>()))>
    : true_type
{};

template <typename From, typename To>
constexpr bool is_static_castable_v = 
    is_static_castable<From, To>::value;

template <typename T>
struct P
{
    T* ptr;

    P(T* x) noexcept : ptr{ x } {}

    operator T*() const noexcept 
    {
        return ptr; 
    }

    template <typename U>
    operator U*()
    {
        return static_cast<U*>(ptr);
    }

    template <typename U = T>
    operator typename enable_if<is_static_castable_v<T*, U*>, U*>::type()
    {
        return static_cast<U*>(ptr);
    }

};


int main()
{
    int* x = new int{ 0 };
    P<int> p = x;

    delete p;
    return 0;
}


```
produces the attached output. I'm honestly not entirely sure what the correct C++17 behavior would be for this code, but I would hazard a guess it's not standards-compliant and should probably be a compile error (but not a compiler crash!)
[clang-crash-out.txt](https://github.com/llvm/llvm-project/files/8580007/clang-crash-out.txt)

Below is the crash reproduction script produced by Clang:
```
# Crash reproducer for Ubuntu clang version 12.0.1-++20210905123922+fed41342a82f-1~exp1~20210904224655.134
# Driver args: "test.cpp" "-std=c++17"
# Original command:  "/usr/lib/llvm-12/bin/clang" "-cc1" "-triple" "x86_64-pc-linux-gnu" "-emit-obj" "-mrelax-all" "--mrelax-relocations" "-disable-free" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "test.cpp" "-mrelocation-model" "static" "-mframe-pointer=all" "-fmath-errno" "-fno-rounding-math" "-mconstructor-aliases" "-munwind-tables" "-target-cpu" "x86-64" "-tune-cpu" "generic" "-fno-split-dwarf-inlining" "-debugger-tuning=gdb" "-resource-dir" "/usr/lib/llvm-12/lib/clang/12.0.1" "-internal-isystem" "/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9" "-internal-isystem" "/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/x86_64-linux-gnu/c++/9" "-internal-isystem" "/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/x86_64-linux-gnu/c++/9" "-internal-isystem" "/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/backward" "-internal-isystem" "/usr/local/include" "-internal-isystem" "/usr/lib/llvm-12/lib/clang/12.0.1/include" "-internal-externc-isystem" "/usr/include/x86_64-linux-gnu" "-internal-externc-isystem" "/include" "-internal-externc-isystem" "/usr/include" "-std=c++17" "-fdeprecated-macro" "-ferror-limit" "19" "-fgnuc-version=4.2.1" "-fcxx-exceptions" "-fexceptions" "-fcolor-diagnostics" "-faddrsig" "-o" "/tmp/test-69c105.o" "-x" "c++" "test.cpp"
 "/usr/lib/llvm-12/bin/clang" "-cc1" "-triple" "x86_64-pc-linux-gnu" "-emit-obj" "-mrelax-all" "--mrelax-relocations" "-disable-free" "-disable-llvm-verifier" "-discard-value-names" "-main-file-name" "test.cpp" "-mrelocation-model" "static" "-mframe-pointer=all" "-fmath-errno" "-fno-rounding-math" "-mconstructor-aliases" "-munwind-tables" "-target-cpu" "x86-64" "-tune-cpu" "generic" "-fno-split-dwarf-inlining" "-debugger-tuning=gdb" "-std=c++17" "-fdeprecated-macro" "-ferror-limit" "19" "-fgnuc-version=4.2.1" "-fcxx-exceptions" "-fexceptions" "-fcolor-diagnostics" "-faddrsig" "-x" "c++" "test-4c483a.cpp"
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWMtu47gS_RpnQ8jQw68svEjiNjCrmUX32qAoymaPLAokFdv99XOKelh27CQ9jbnABTpwHImPqlNVh1XFpDo7Lb_ulGVCZ3KUPI3C1Sh8Gs3C9tO8xmt8mKit03uWyVyVyildWqZzZh0vM24yVqjUcHNi7lRJO4pfmJFZLaRllZGV0XiyMmO5KiSz6oe8EK2gvy6ychTPHdtKx0SzmTnNDtr8TeLS2r1VtpM8k8ayUbwYJS-keuMMV9aNki8MaxlGa6cK5U4YGcWPF2oBi7RkzO0Aiu8l9HK7I23fYSw7KLdjnKVqu5XmrR2NLOtMLRzLeWGhHAhaFfPn5oHhB7idEjCytE4eK8NSrQv2yotaAuGq2TxKnrutq_PzUAe-_7UK2vuOBif3VcEdrX3xOyEo81Emb5DOkvzz1ct61Sojdw6xYT4t5EblZ2zvKjmLvC8Jqwg1AJwXXRhdW1VuPTqP6-s7BrYhL1TuKHwGTBYVQppLI0shx0LvMX_AL4bx3dJ4zbNs06_6wAzWxYl4qDJZOvCOAfEtoOwtRhJkKw7eZ9JxVbDe2PsqeY0z4sxp44H6eA_wxgtVOtCeBbT2AhckfR3FM_rAt8kvKxqPx-8oGqiA3ayNxrXBP0-WW2Cw4wkCReGPSrxoZSO7JU93DWhBxouQskSfKG7R-Gep1CWgeE2goPhTBl6dZF4c-MlufKa4lTM-I7Ifes8DjZuIqR1a5FYEttTyKGTl2N3ks-FIjQZ0WwzB9p59QdTjViakIXZFoQ_woCqZJDCc3AmzYTWExBSE4Xn-yM61Ib8Pk5W-ePUHT18TSNlNi15wPCDzePrcSuefy2e3YHyoEwK6fR712bUDHg_2kFN1w9cuSq0EP9ZSmBz45SyK7LpRQn7drCuqvjVv8-q9f4bykQc6HnqO_qsq8tcNmiLfPbHKmSuBNPUXvOanj5dcT5oNSOFH5hNX47Cr3bqShjttvIb2vHinXJ8aH4YhJPox0tWmbIFdLHyj6Kbt3y6i3GP51mP5WPcltfxOTyTCNDiGP4Wqq3S3sPWrhsX-Fm-aKvVEtOhRnR_7XPXf23mjDPhv1Fe256ocIrjQ7gvwE9EH7ijlwQ-AT-FFA9BwED4ofeta-dXHG0TNZCHh6epiZ2tdeC9f3mzr2-7X-u6XO8fFDvlX166q3Zj9gV58z3a6lNYVJ5-vqZwbiRdbG8kOO-78VqGNkThxL6P4GZ9ozlK5468KYT5QV49XllPM-3tG283_0c7v-A_q6Tnb1miumYK_5tZr7Pp9G6CmVoXicDZ19XbnN8KCFDQ5kQbOaAndLqQx0IZ4kA5fZ7op0_X30TlU02dR8HIb-JkA1o8dqs90hf075ypLHPP1fovLQJ22xb0oXrs_AVB8h_14pUsB9YyL6SIMwzk1ADdk96r997NEEUQ-bFxJC5m_ZyA01H0zK4xC-uivKumJvZDQ-5e1hL1ciIHZ5P5vaV26mnlE7BWXJpIexeNwHAVN5OIwjsLHcBrFySOV3-dcZpMomcR8EedBNJp_QY6nP-3CSRxPZtPpGEvOuldGQTjjZkuuo5LvwKCx74Rieg2sw-VhJTq2UKXvd_9p1FaVnK4f-z0iTSKY7wXWtTXkcZV2fo9oNKWT17i5ky9E1D06-A6lpXk7Lmab2SSoRFCosj4G27Lu1sm9coFOv3fve9CcHwM0KN1IN4RvLbi__XZTmbKUq4LcSHk95oHCHypX0gwmBUgd-OIW-B64V4xMEhCN_HA7eu3A_RlEsMd56kA2ya1flRuICCqNlALdyWpgTb7nbhfgoJS6Hyp1YHSNSx8IS9O9HF_IqKZqA48obgdw6_KgyizwybofdQi-dIGoOv_C88Fs0k_XpRxMbmUJ_4ghDouj7oLswE0eqBLRUufoZjKt6TpOYmg4WW2ztJs00uraCAkXd96-y5zmvWXOujkInRzvMtAwUPaEzmZ_LathHV14WjFbAQPWLcMG9Fo_duuuvlQpippS4bo9CM3a_736G5t-I3ovROuUi79BzeyzSOisFkN5n9z2Kb7elYo7FB7EPenvufuzkn5V9b1y0OSBDOVLCroTIh0Jc05Uvr4D754aBT8W9azIYYAI2uoGsZNxfD7VuTgeg6YdH-bv_MaQ0AV0ZIpvS22RVM8zuDpDeJ-O9Nk6t_f_N0KyDmaPIgqn4x7zsX3oiXSd19tW7nel-13pPlfp_r9Pzf3zEEzEZJHwi2PRd7gP2TLJHpNH_uCUK-TSN8Jt04xmVsOC5p4gun8ldX1uXpdNO91dVe1DbYrlT3f4ytrat_jTaTSdPuyWcjKNMxnPozCdT-bhPOEyz7IkjngciWQ6eSh4Kgu7xD0D9vjrH4kg26arB7VEKx2jkV6EszhO4nGWL8QsjybxPM5yIaPRJJQ4KcWYcIy12T6YpYcEalhMFso6e57kFk4upfTqIJ_XbqfN8qTLHyDTg1e99ND_AcBJ05o">