scanner: make use of __has_attribute()

A more generic way to evaluating various attributes, __has_attribute is
available with gcc, clang, even the Oracle/Sun compiler.

Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
diff --git a/src/scanner.c b/src/scanner.c
index 679e006..c93070c 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -1744,7 +1744,11 @@
 	 * we want to have the symbols hidden. */
 	if (vis == PRIVATE) {
 		symbol_visibility = "WL_PRIVATE";
-		printf("#if defined(__GNUC__) && __GNUC__ >= 4\n"
+		printf("#ifndef __has_attribute\n"
+		       "# define __has_attribute(x) 0  /* Compatibility with non-clang compilers. */\n"
+		       "#endif\n\n");
+
+		printf("#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4\n"
 		       "#define WL_PRIVATE __attribute__ ((visibility(\"hidden\")))\n"
 		       "#else\n"
 		       "#define WL_PRIVATE\n"