377096: fix for corrupt annotation creation
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
index 583eeaa..de217d5 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
@@ -20,6 +20,7 @@
  *                          Bug 415399 - [1.8][compiler] Type annotations on constructor results dropped by the code generator
  *                          Bug 415470 - [1.8][compiler] Type annotations on class declaration go vanishing
  *                          Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
+ *                          Bug 434556 - Broken class file generated for incorrect annotation usage
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler;
 
@@ -2333,9 +2334,11 @@
 			NormalAnnotation normalAnnotation = (NormalAnnotation) annotation;
 			MemberValuePair[] memberValuePairs = normalAnnotation.memberValuePairs;
 			if (memberValuePairs != null) {
+				int memberValuePairsCount = 0;
+				int memberValuePairsLengthPosition = this.contentsOffset;
+				this.contentsOffset+=2; // leave space to fill in the pair count later
+				int resetPosition = this.contentsOffset;
 				final int memberValuePairsLength = memberValuePairs.length;
-				this.contents[this.contentsOffset++] = (byte) (memberValuePairsLength >> 8);
-				this.contents[this.contentsOffset++] = (byte) memberValuePairsLength;
 				for (int i = 0; i < memberValuePairsLength; i++) {
 					MemberValuePair memberValuePair = memberValuePairs[i];
 					if (this.contentsOffset + 2 >= this.contents.length) {
@@ -2346,17 +2349,21 @@
 					this.contents[this.contentsOffset++] = (byte) elementNameIndex;
 					MethodBinding methodBinding = memberValuePair.binding;
 					if (methodBinding == null) {
-						this.contentsOffset = startingContentsOffset;
+						this.contentsOffset = resetPosition;
 					} else {
 						try {
 							generateElementValue(memberValuePair.value, methodBinding.returnType, startingContentsOffset);
+							memberValuePairsCount++;
+							resetPosition = this.contentsOffset;
 						} catch(ClassCastException e) {
-							this.contentsOffset = startingContentsOffset;
+							this.contentsOffset = resetPosition;
 						} catch(ShouldNotImplement e) {
-							this.contentsOffset = startingContentsOffset;
+							this.contentsOffset = resetPosition;
 						}
 					}
 				}
+				this.contents[memberValuePairsLengthPosition++] = (byte) (memberValuePairsCount >> 8);
+				this.contents[memberValuePairsLengthPosition++] = (byte) memberValuePairsCount;
 			} else {
 				this.contents[this.contentsOffset++] = 0;
 				this.contents[this.contentsOffset++] = 0;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
index d10ce50..d041dec 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
@@ -147,7 +147,7 @@
 				// if binding unused generate then discard the value
 				this.initialization.generateCode(currentScope, codeStream, true); // AspectJ: final param needs to be true (was false) 
 				// new code:
-					if ((binding.type == TypeBinding.LONG) || (binding.type == TypeBinding.DOUBLE)) {
+					if (TypeBinding.equalsEquals(this.binding.type,TypeBinding.LONG) || TypeBinding.equalsEquals(this.binding.type,TypeBinding.DOUBLE)) {
 						codeStream.pop2();
 					} else {
 						codeStream.pop();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java
index f3de6bd..40a44be 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java
@@ -227,7 +227,7 @@
 			}
 			ReferenceBinding currentType = (ReferenceBinding) this.resolvedType;
 			if (qualifyingType == null
-					|| (currentType.isMemberType() && qualifyingType!=currentType.enclosingType())) { // AspectJ Extension - pr235829
+					|| (currentType.isMemberType() && TypeBinding.notEquals(qualifyingType,currentType.enclosingType()))) { // AspectJ Extension - pr235829
 				qualifyingType = currentType.enclosingType(); // if member type
 				if (qualifyingType != null) {
 					qualifyingType = currentType.isStatic()
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
index 41b8a71..472e746 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
@@ -334,7 +334,7 @@
 		// for protected we need to check based on the type of this
 		ReferenceBinding currentType = scope.enclosingSourceType(); //invocationType();// NewNew AspectJ Extension - was enclosingSourceType();
 		// MUST be in the same package as the invocationType though... (pr 71723)
-		if (invocationType != currentType) {
+		if (TypeBinding.notEquals(invocationType,currentType)) {
 		    // this MUST be an ITD
 		    if (invocationType.fPackage != currentType.fPackage) return false;
 		}