Well, I figured out the problem finally! It's the new keyword. When you use new, it has to be a pointer, and class X is a child class to logic_error. So, logic_error cannot be an X, but X is a logic_error because a parent cannot be its child, but its child is its parent. I could have sworn I read something in the official C++ website that I can't remember at the moment that said that pointers were only kept around because of something to do with the fact that C++ was built on C. It distinctively made it sound like they would have deprecated pointers and only used references in C++ if they could have. You'd think they'd try to make pointers as unimportant as they can, but no, they're still quite vital to properly running C++, aren't they?

So, to get it to work correctly, I needed to include logic_error* as potential throw.

Minimally, I needed to change this:
Code:
void z() throw(X)

{
    throw new logic_error("logic_error in z()");

}
into this:

Code:
void z() throw(X,logic_error*)

{
    throw new logic_error("logic_error in z()");

}
It couldn't go anywhere because it was being blocked by that throw(X) permission statement that was looking for thrown class X data, not its parent data of class logic_error. And new meant it needed to be looking for a pointer.