<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=http://email.email.llvm.org/c/eJylVk2PozgQ_TXkYjUi0HQ3hxzy0ZH60DOHmTmvjCmCN8bO2qZ78--3yoSEhMxoNCuhxGD71auvZ5emOi7WRjtZgWW-AVYbpcyn1DsmTAVRumafjRQN6xw45o8HYFxr47mXuIsZzTirpKA3bo8xi9KXN88E16wERGgPUkHFnOe64spoQBzCjp4SoTgN0u2B-wb_vMGfGpfHbcseastb-DR2z7amw71kADfFUVpEySZKlqffp6R_TPk3IIsPeBBRuqKnn08zqYXqKmBRth5BpdvLS9xE2esYldysoGYfRlbkUZS_vh_XXKmSi_13nCQW6QtN0yhbXVF6TKT2YGsugOE2xZ1D40v25dvXQPJm8cGaA1h_JEMao-hNKwXF3Xlr9A4N4M73zvNSweYcafTmy7cfP942UbqkxTf8sleEW4rTJ3dD8YFsBe4WdtIh2WEz8cS5ibft8bJiCnUKBJlb_8QkOgq6uo1Te1DQgu6raQjWlKmm-hHgey5SyyGGz2cbhaxDAKXCv3mUbejNgcKvNM5XrsMos7A334T8nQupGOPgQ9vic-wGgDtJGFU-gWYjlOfNCPE0sOA7qxnBX9ZeFv5ZZgae04ic6gMJXCrhbRPc6afiMD9mPQyuI4DOX_ajowFipYzY_yXM4YisziSuumHi-QjlV_7fLaeJe9jC9CSFb6Rj9GhhrMUGOysXig57Q1WTeh-07aRHlrnGdKpiFg7G-ikiqhdYayxrwAYg1CxsZoLYw7FXQVOH90sFEAX496CkkF4dSeFOCSDVGkzUCDrJ4jku6AK7Cf24SpNLslGTbkNdTP0Y4oFW2172sIhQyAPzXjEZ6K4Fi6pDzYEFx6trnOUfc497C69nA7_vDGna9m6BTHUExZa1XOogFJ71pLndiRMKpk80nKgvhy80_TG8FNPSOgsRMamNGSRgUHMNn7f9fh7kK9pwp3uvUpW_nrwef3y-SWdxsOhRHVamDeC5zPBEVFWUr9Hb9E4FjFXn1wSvm-sna09tm9zp1uHcHWfiOzViy4909LfG4pGbpqAbkm4SeQzKPx04j1-xALHHcFB2u-DJmpWdZxJLFUDhPcOwFi8aOMBG3TV3m7fhH1R9OO3D_FDIdJKEDm2lw6rHqwvJgHSuw4sIXVb4ThvnpYjZ0pFJ6ch-bwLvCZ9SqcHYQCx8o-OFY0Awakc6lYXlDsHRr0572UI8qxZZVWQFn_EOiduFk7ADNeusWjTeHxxVQejNnfRNV8ZoBV-U-hj-HvAyEK4I6TYQRmbbPMvT51mzKIs0eeFp8fhUiQQvF8-Pj3mazDOepXlRinSmeImxW2CCMaRYor3PFN58M_v_DOQiTVJ8kvm8SObJUwx5UkH1BOJxnsxLUVNrYiOqmHBiY3czuwiQmGSHkwo7wl0msZHkTgMEwsjQo2zC4h2tYp5CAkUDYk-3RVKer-cL3prV3Pmx8o5SPwusF4HyfxZNRMs>53527</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed type checking for Objective-C fast dictionary enumeration
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
siegel
</td>
</tr>
</table>
<pre>
Consider the following code, which uses type annotations on a dictionary. (It can be compiled standalone using `clang /path/to/file.mm -framework Foundation`.)
```objective-c++
#include <Foundation/Foundation.h>
typedef void (^MyCallbackType)(void);
@interface MyClass : NSObject
@property (nonatomic, strong) NSMutableDictionary<NSUUID*, MyCallbackType> *callbacks;
- (id)registerCallback: (MyCallbackType)myCallback;
- (void)callCallbacks;
@end
@implementation MyClass
- (instancetype)init
{
if (nil != (self = [super init]))
{
self.callbacks = [NSMutableDictionary dictionary];
}
return self;
}
- (id)registerCallback: (MyCallbackType)callback
{
NSUUID *callbackID = NSUUID.UUID;
self.callbacks[callbackID] = Block_copy(callback);
return callbackID;
}
- (void)callCallbacks
{
// this is incorrect code, and I think the compiler should report
// an error here, since the key type of the dictionary is explicitly `NSUUID`.
for (MyCallbackType callback in self.callbacks)
callback();
// correct formation: use the object enumerator instead
/*
for (MyCallbackType callback in self.callbacks.objectEnumerator)
callback();
*/
}
@end
int main(int /*argc*/, char **/*argv*/)
{
MyClass *foo = [MyClass new];
[foo registerCallback:
^()
{
printf("hello world\n");
}
];
[foo callCallbacks];
return 0;
}
```
This may be more "enhancement request" than "bug", but it feels to me as though the compiler should have caught the enumeration type mismatch and issued a diagnostic. As it is, the code will compile, but will (naturally) crash at runtime.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJydVkuPozgQ_jXkYjUi0EkPhxzy6Eh96JnDzJxXxhTBG2NnbdO9_PutMiEhITNajWSBn1VfvT67MGW32hrtZAmW-RpYZZQyn1IfmDAlROmWfdZS1Kx14JjvTsC41sZzL_EUM5pxVkpBI267mEXplzfPBNesAJTQnKSCkjnPdcmV0YBySHa0TITi1En3J-5r_HmDnwq3x03DnirLG_g09sj2psWzpAAPxVGaR8kuStbn7zLpmyn-BkTxAU8iSjfU-vU0k1qotgQWZduRqHR_HcR1lL2OpZKZJVTsw8iSLIoWr-_dlitVcHH8gYuEIv1Cy9TLNjeQnhOpPdiKC2B4THHnUPmaff3-LYC823yy5gTWd6RIoxe9aaQgvztvjT6gAjz53npeKNhdPI3WfP3-8-fbLkrXtPkOX_aK4tbiPOXuID6RroDdwkE6BDscJpy4NrG26a47pqLOjiB121-oRENBl_d-ak4KGtB9Ng3OmiLVlD8CfI9Fajn48OWiI5dVcKBU-JtH2Y5GDhTOUn-xcS16mYWzi12I3yWR8rEcbHQsvvhuEPAgCKPMJ6HZSMrLbiTx3LHgW6sZib_uvW78s8gMOKceOecHArhmwtsumNMvxWF9jHro3HoAjb-eR0ODiI0y4viXMKcOUV1A3FTDxPKRlN_Z_zCdJuZhCVNLcl9Lx6hpYazFArswF5IOe0NWk_oYuO3MR5a52rSqZBZOxvqpRGQvsNZYVoMNgpCzsJhJxBG6ngVNFcbXDCAI8O9JSSG96ojhzgEg1hpUVCh0EsWLX9AEduf6cZYm12AjJ927Op_aMfgDtTY97WESIZEH5D1jMtBtAxZZh4oDE46Xt3LWf4w97jW8XhT8f2OI0_YPE2TKI0i2rOFSB6LwrAfN7UGcpWD4RM0J-nqYoeWPYZBPU-tCRISkMmaggIHNNXze1_uls9jQgQfVexOqxevZ6vHky10485NFi6qwM60B72WGN6Iqo8UWrU0fZMCYdX4P8La4frH3XLbJg2od7t1xJH5QITa8o6u_MRav3DQFXRN1E8mjU_5pwXmcxQTEGsNO0R6CJVtWtJ5JTFUAhe8Mwxp8aGAHC_VQPyzemn9Q9uGyD-tDItNNEiq0kQ6zHp8uRAPSuRYfIvRY4QdtnJciZmtHKqUj_b0KfCd8SqUGZQOwMEfXC0eHoNc6upWF5Q6Fo12t9rKBeFausjLPcj7zSAGwekelqDOAETWII718qIq-XR4rW1Zx58csMjJj1lq1qr0_OUqfUNQH6eu2iBEeDpT6GH5P-IoIb4t0HyxFk_aLbJG-zOrVc14k6XKeLaFKnkWyzDLxXOVlWb1wyKpqPlO8QKevMDMwFpjbvbMoLovdTK7SJMWWzOd5Mk-WMSySEsoliOd5Mi9ERRWJ9adiwhEbe5jZVYCEsXW4qLAQ3HUR60ceNEBQh_J5izG2KyfhAGoWNK8C8v8Agd8v9Q">