Why `std::invalid_argument` is not caught with no-rtti in macOS M1 environment?

406 Views Asked by At

Today I met a weird behaviour in catching exceptions in C++, could anyone clarify it to me? Code snippe

#include <iostream>
#include <string>
#include <exception>


int main() {
  try {
    std::stod("notanumber");
  } catch (const std::invalid_argument&) {
    std::cerr << "std::invalid_argument" << std::endl;
  } catch (const std::out_of_range&) {
    std::cerr << "std::out_of_range" << std::endl;
  } catch (const std::exception&) {
    std::cerr << "Caught by ancestor" << std::endl;
  } catch (...) {
    auto ptr = std::current_exception();
    auto type = __cxxabiv1::__cxa_current_exception_type();
    std::cerr << type->name() << std::endl;
    std::cerr << "..." << std::endl;
  }
  return 0;
}

Writes to output

St16invalid_argument
...

Environment details

C++ 14, disabled RTTI
Clang 13.1.6 arm64-apple-darwin-21.6.0
macOS Monterey 12.6

I expect exception to be caught on the very first catch block

Upd. Even simplest catch doesn't work for me on the environment

try {
  std::stod("notanumber");
} catch (const std::invalid_argument&) { // not caught
  std::cerr << "std::invalid_argument" << std::endl;
}
0

There are 0 best solutions below