Bug 464624 - C++ Parser fails with Syntax error on function declaration with __declspec and non-native type

Allow __declspec after identifier in decl-specifier.
See https://docs.microsoft.com/en-us/cpp/cpp/declspec

Change-Id: Ifdaeb649abcfa1b7391e2799072b1afbc07a16a1
Signed-off-by: Marc-Andre Laperle <malaperle@gmail.com>
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java
index 0de1810..43056df 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java
@@ -5433,6 +5433,17 @@
 		parseAndCheckBindings(getAboveComment(), CPP, true);
 	}
 
+	//typedef struct _MyStruct {
+	//} MyStruct;
+	//
+	//MyStruct __declspec(dllexport) foo;
+	//MyStruct  __declspec(dllexport) __declspec(deprecated) bar;
+	public void testDeclspecAfterDeclSpecifierIdentifier_464624() throws Exception {
+		for (ParserLanguage lang : ParserLanguage.values()) {
+			parseAndCheckBindings(getAboveComment(), lang, true);
+		}
+	}
+
 	// struct Outer {
 	//    struct {int a1;};
 	//    struct {int a2;} a3;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java
index 77e2f6d..bd63a89 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java
@@ -1162,8 +1162,8 @@
 						throwBacktrack(LA(1));
 					attributes = CollectionUtils.merge(attributes, __attribute_decl_seq(true, false));
 					break;
-				case IGCCToken.t__declspec: // __declspec precedes the identifier
-					if (identifier != null || !supportDeclspecSpecifiers)
+				case IGCCToken.t__declspec:
+					if (!supportDeclspecSpecifiers)
 						throwBacktrack(LA(1));
 					__attribute_decl_seq(false, true);
 					break;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java
index 5ad8188..4709d51 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java
@@ -3579,8 +3579,8 @@
 						throwBacktrack(LA(1));
 					attributes = CollectionUtils.merge(attributes, __attribute_decl_seq(true, false));
 					break;
-				case IGCCToken.t__declspec: // __declspec precedes the identifier
-					if (identifier != null || !supportDeclspecSpecifiers)
+				case IGCCToken.t__declspec:
+					if (!supportDeclspecSpecifiers)
 						throwBacktrack(LA(1));
 					attributes = CollectionUtils.merge(attributes, __attribute_decl_seq(false, true));
 					break;