Language: C++

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <utility>
 
#define YNUM(X) ( X < 0 ? X + 3 : X )
 
int h, w;
bool map[502][502];
char in[502];
int data[3][502][502];
int data_max = 0;
int height_sum[502][502], width_sum[502][502];
 
int main(){
    while( std::cin >> h >> w, w + h != 0 ){
        data_max = 0;
 
        memset( height_sum, 0, sizeof(height_sum) );
        memset( width_sum, 0, sizeof(width_sum) );
 
        for( int i = 1; i <= h; ++i ){
            std::cin >> in;
            for( int l = 1; l <= w; ++l ){
                map[i][l] = ( in[l - 1] == '.' );
                if(map[i][l]){
                    width_sum[i][l] = width_sum[i][l - 1] + 1;
                    height_sum[i][l] = height_sum[i - 1][l] + 1;
                }
            }
        }
 
        for( int i = 1, n = 1; n <= h; n++, i = n % 3 ){
            for( int l = 1; l <= w; l++ ){
                memset( data[i][l], 0, sizeof(int) * 502 );
                if( map[n][l] ){
                    if( map[n - 1][l] && map[n][l - 1] ){
                        int x_cnt = width_sum[n][l], y_cnt = height_sum[n][l];
 
                        for( int m = 0; m < 502; ++m ){
                            if( data[YNUM(i - 1)][l][m] ){
                            	data[i][l][std::min(m, x_cnt)] = data[YNUM(i - 1)][l][m] + 1;
                            	data_max = std::max( data_max, wh.first * wh.second );
                        	}
                        }
                        for( int m = 0; m < 502; ++m ){
                            if( data[i][l - 1][m] ){
                            	data[i][l][m + 1] = std::min(data[i][l - 1][m], y_cnt);
                            	data_max = std::max( data_max, (m + 1) * data[i][l][m + 1] );
                            }
                        }
                         
                    }else if( map[n - 1][l] ){
                        for( int m = 0; m < 502; ++m ){
                            if( data[YNUM(i - 1)][l] ){
                            	data[i][l][1] = std::max( data[i][l][1], data[YNUM(i - 1)][l][m] + 1 );
                            	data_max = std::max( data_max, wh.first * wh.second );
                        	}
                    	}
 
                    }else if( map[n][l - 1] ){
                        for( int m = 1; m < 502; ++m ){
                            if( data[i][l - 1][m] ){
                            	data[i][l][m + 1] = std::max( data[i][l][m + 1], 1 );
                       	    	data_max = std::max( data_max, (m + 1) * data[i][l][1] );
                        	}
                        }
 
                    }else data[i][l][1] = std::max( data[i][l][1], 1 ), data_max = std::max( data_max, data[i][l][1] );
 
                }   
            }
        }
 
        std::cout << data_max << std::endl;
    }
    return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:46:64: error: 'wh' was not declared in this scope; did you mean 'w'?
   46 |                                 data_max = std::max( data_max, wh.first * wh.second );
      |                                                                ^~
      |                                                                w
a.cc:60:64: error: 'wh' was not declared in this scope; did you mean 'w'?
   60 |                                 data_max = std::max( data_max, wh.first * wh.second );
      |                                                                ^~
      |                                                                w