Properly handle functions returning constant pointer

Properly handle functions returning constant pointer.  Examples:
```
int * const Func();
const int * const Func();
int * const * const Func();
[...]
```

This fixes compiler warning/errors about prototypes that don't match.  This also fixes 'modifier' of a function that contains 'const const' for functions like 'const int * const MyFunc()'.

I also adjusted unit tests and added new ones.