Daniel Berlin <[EMAIL PROTECTED]> writes: | >> object volatile). | > | > I don't understand your point. given | > void Foo (char const * a) { *(char *)a = 5; } | > the compiler generates code to store 5 through the pointer 'a'. It doesn't turn | > this into a call to 'abort', because it thinks you're writing to const storage. | | Is this *always* the cast, or just in the example above? | | > | > So, here it appears the compiler does believe the (char *) cast. | | I imagine this is due to some workaround in an optimizer for some bug | it exposed elswhere.
I do not understand your sentence; could you clarify? Given the above definition of Foo(), the following shall pass assertion int main() { int char a = 30; Foo(&a); assert(a == 5); } | > Why should it | > not believe a (char volatile *) cast -- unless it can determine the static type | > of the object pointed to? | | It appears he was saying that *even if it could determine the static | type*, the volatile qualifier on the cast *made the object not that | type anymore*. I think care needs to be exercise here about terminology, because it appears that everybody has its own dialect that ultimately leads to lot of confusion. Let me give my answer based on the terminology in the C++ standard that I'll reprroduce below. If you can determine that the *dynamic type* of an object is const, and yet users writes to it, then you're well-founded to do whatever you like. Whoever, just using the static type without further information that relates it to the dynamic type is insufficient. Similarly, if you can determine that the dynamic type of an object is volatile, yet uses access it through non volatile then you can whatever you like with the program. Notice that "dynamic type" talks about type of objects, whereas static type talks about type of expression. 1.3.3 dynamic type the type of the most derived object (1.8) to which the lvalue denoted by an lvalue expression refers. [Example: if a pointer (8.3.1) p whose static type is pointer to class B is pointing to an object of class D, derived from B (clause 10), the dynamic type of the expression *p is D. References (8.3.2) are treated similarly. ] The dynamic type of an rvalue expression is its static type. 1.3.11 static type the type of an expression (3.9), which type results from analysis of the program without considering execution semantics. The static type of an expression depends only on the form of the program in which the expression appears, and does not change while the program is executing.