¿Mis parámetros lambda realmente sombrean a mis locales?

Estoy tratando con un código C que toma algunos datos y los reenvía a la función pasada:

void foo(int* data, void (*fun)(int*)){
  (*fun)(data);
};

Lo siguiente funciona sin previo aviso:

void bar(int* data){};

int main(){
  int data=0;
  foo(&data,bar);
}

Sin embargo, si uso una lambda en su lugar:

int main(){

  int data=0;
  foo(&data,[](auto data){});
}

Me sale la siguiente advertencia:

warning: declaration of ‘data’ shadows a previous local [-Wshadow]
   foo(&data,[](auto data){});
                         ^
o.cpp:14:7: note: shadowed declaration is here
   int data=0;

Pero pensé que un grupo de captura vacío excluiría la primera instancia durante su búsqueda.

¿Es legítima esta advertencia?
¿Por qué la captura vacía no es suficiente para evitar advertencias?