<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">