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

    <tr>
        <th>Summary</th>
        <td>
            miscompilation - "Illegal instruction" with exception handling in nested functions
        </td>
    </tr>

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

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

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

<pre>
    The resulting executable from compiling this sample code (from C++ for Dummies, ch. 25) crashes. The output is supposed to be

`
Constructing object a
Constructing object b
Constructing object c
Constructing object d
Destructing object d
Destructing object c
Destructing object b
Int catch
Destructing object a
`

but instead terminates with

`
...
Destructing object b
Int catch
Illegal instruction (core dumped)
`

The code is as follows; I'm unsure what exactly is causing it to crash, but the code is very minimal as-is.

`
#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

class Obj
{
public:
        Obj(char c)
        {
                label = c;
                cout << "Constructing object " << label << endl;
        }
        ~Obj()
        {
                cout << "Destructing object " << label << endl;
        }

protected:
        char label;
};

void f1();
void f2();
int f3()
{
        Obj a('a');
        try
        {
                Obj b('b');
                f1();
        }
        catch(float f)
        {
                cout << "Float catch" << endl;
        }
        catch(int i)
        {
                cout << "Int catch" << endl;
        }
        catch(...)
        {
                cout << string("Generic catch") << endl;
        }
}

int main(int nNumberofArgs, char* pszArgs[])
{
        f3();
        // wait until user is ready before terminating program
        // to allow the user to see the program results

        //system("PAUSE");
        return 0;
}

void f1()
{
        try
        {
                Obj c('c');
                f2();
        }
        catch(string msg)
        {
                cout << "String catch" << endl;
        }
}
void f2()
{
        Obj d('d');
        throw 10;
}
`

The crash occurs when compiling with Clang++ 10 and 11 as tested on Debian and Termux. It compiles and runs as expected when using g++.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVsuS4rgS_RqxySiHkHl5waIKmhu1uT0R3fMBspTG6pAlhx5NMYv59gnJpgoomKZnY4TyfXSUKe692hvENZm_kPl2wmNorVvXal8ryyhlk9rK4_p7i-DQRx2U2QO-oYiB1xqhcbYDYbte6SQJrfLgeddrBGElAmGrrLIh7IWwF2isg23sOoWesA2ItgA2J6wC4bhv0ReQQtkY-hgg-Yp9bz1KCBZqJHRL6PP4XdBhsbHGBxdFTs3WP1AE4PdF9X2RuC-Sg2iLvyERdyVjDq8mgOBBtHcV-VWtw7dO2BgfkEsI6DpleEAPBxXamwgVRfGbqbxqjXuuc5RsYE06SmEdgoxdj5Kw6mZu6fjyySsP3ENjtbYHT8oXeCVs2UE0PjqEQ8sD4BsXQR-TquDRp6xUSCedyZD4kSoNZx5_ojtCp4zquAbun5QvblZMWKmM0DExsNwIH6SypPxyT6hVfUeqrA8Oefchzt8hWcM79D0XCD5IUr6cawjNvYev9Y9xczlK-1hrJUh5yphWSYetRMsdiA9UafVukta00rxGDaTcgjgLlSTCxpByJeUGCGO36EsYO2mc_OQ_aKS-8Lbcvq__HhL7l5SuAt9g13-Im0FyNqAIKM9xyghlLx-Wy-0V7D-tktBMx7xPsmGXXe0qE6ApL0o8q-9r_QN4Fi45YctzQ0Kr4I73UEmG9WBYfzYktPqU3hXwwz1kq0ZbHqB5_AB22WA0Z4-c8SlUgkI9HuijW_xemNSIHgvig1Nmn3Fi_0ODTon3iGlc_DLoJaFSfR1XZizV_D92NTrbPLv9OIe4I-wZev9X3srD8CYt3glzHpXtCNvBgasA0QSlIXp0qV855PIINTapcZ5adbofvbN7x7trF8ECTw0zN73sJFjwiPn_aDMOYn_R-E4e_NEH7Abc_nj-89uXAa_zbB2G6AzQi1t09wp9AuAXzBcD88Vt5l9fwTs8GU4fOr9_nJPfBpvHaXlaXDaHm31ADkXJG32gdfYA01tg3piLaayBFSI6D4cWzdnLKQ1v2GieSJ9fSlMK3EiYTtMYDegDSrAGtlgrbrLoO7ouvhXwGkY_6PO-iybPXnzrcxMdQg0ja_ReTOS6lFVZ8Qmup4vVlFLK5mzSrgVbSrmqK4ZciPlqVi2aesEbOmMlTpvpbKLWjLKSzmhFaUnnrJjP6hUvq-l0Wc0rIRdkRrHjShda_-wK6_YT5X3E9YJRNp_kBu7zc5MxgwfIwsTS-Xbi1snmqY57T2ZUKx_8h5eggsZ1p_xQLM-Pkqfcjj6_VhIDMqT4JrDPqi03MkOtDJgBzyaarO0n0el1G0Lv08TJN2mvQhvrQtiOsF1KYvx56p1Ns42wXU7dE7bLpf0TAAD__8AqN2E">