|  | // RUN: %clang_cc1 -analyze -analyzer-checker=core,core.experimental -analyzer-store=basic -verify %s | 
|  | // RUN: %clang_cc1 -analyze -analyzer-checker=core,core.experimental -analyzer-store=region -verify %s | 
|  |  | 
|  | // Test function pointer casts.  Currently we track function addresses using | 
|  | // loc::FunctionVal.  Because casts can be arbitrary, do we need to model | 
|  | // functions with regions? | 
|  | typedef void* (*MyFuncTest1)(void); | 
|  |  | 
|  | MyFuncTest1 test1_aux(void); | 
|  | void test1(void) { | 
|  | void *x; | 
|  | void* (*p)(void); | 
|  | p = ((void*) test1_aux()); | 
|  | if (p != ((void*) 0)) x = (*p)(); | 
|  | } | 
|  |  | 
|  | // Test casts from void* to function pointers.  Same issue as above: | 
|  | // should we eventually model function pointers using regions? | 
|  | void* test2(void *p) { | 
|  | MyFuncTest1 fp = (MyFuncTest1) p; | 
|  | return (*fp)(); | 
|  | } |