> On Feb 24, 2015, at 11:14 AM, Ben Langmuir <[email protected]> wrote: > Hi John, > > As we discussed: > > Allow (Object *)kMyGlobalCFObj casts without bridging > > Previously we allowed these casts only for constants declared in system > headers, which we assume are retain/release-neutral. Now also allow them > for constants in user headers, treating them as +0. Practically, this > means that we will now allow: > id x = (id)kMyGlobalConst; > > But unlike with system headers we cannot mix them with +1 values: > id y = (id)(b ? kMyGlobalConst : [Obj newValAtPlusOne]); // error > id z = (id)(b ? kSystemGlobalConst: [Obj newValAtPlusOne]); // OK > > <extern-global-const-unbridged-cast.patch>
Yes, this good great, thank you. You should also adjust the ARC specification: 1. Add "a load from a const non-system global variable of C retainable pointer type” to the list of known unretained expressions in the section entitled "Conversion to retainable object pointer type of expressions with known semantics”. This should have a “beginning LLVM 3.6” note; when it’s available in a released Apple compiler, we can be more specific. 2. Add a note to the rationale explaining the different treatment of system and non-system globals: basically, that it’s reasonable to assume that global constants were initialized with true constants (e.g. string literals), but user constants might have been initialized with something dynamically allocated, using a global initializer. John. _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
