Buggy code:
public class ConstructorDeclaration extends AbstractMethodDeclaration { public ExplicitConstructorCall constructorCall ; public TypeParameter [ ] typeParameters ; public ConstructorDeclaration ( CompilationResult compilationResult ) { } public void analyseCode ( ClassScope classScope , InitializationFlowContext initializerFlowContext , FlowInfo flowInfo ) { } public void analyseCode ( ClassScope classScope , InitializationFlowContext initializerFlowContext , FlowInfo flowInfo , int initialReachMode ) { if ( this . ignoreFurtherInvestigation ) return ; int nonStaticFieldInfoReachMode = flowInfo . reachMode ( ) ; flowInfo . setReachMode ( initialReachMode ) ; checkUnused : { MethodBinding constructorBinding ; if ( ( constructorBinding = this . binding ) == null ) break checkUnused ; if ( ( ( this . bits ) & ( ASTNode . IsDefaultConstructor ) ) != 0 ) break checkUnused ; if ( constructorBinding . isUsed ( ) ) break checkUnused ; if ( constructorBinding . isPrivate ( ) ) { if ( ( ( this . binding . declaringClass . tagBits ) & ( TagBits . HasNonPrivateConstructor ) ) == 0 ) break checkUnused ; } else <START_BUG> if ( ( ( this . binding . declaringClass . tagBits ) & ( ( TagBits . IsAnonymousType ) | ( TagBits . IsLocalType ) ) ) != ( TagBits . IsLocalType ) ) { <END_BUG> break checkUnused ; } this . scope . problemReporter ( ) . unusedPrivateConstructor ( this ) ; } if ( isRecursive ( null ) ) { this . scope . problemReporter ( ) . recursiveConstructorInvocation ( this . constructorCall ) ; } try { ExceptionHandlingFlowContext constructorContext = new ExceptionHandlingFlowContext ( initializerFlowContext . parent , this , this . binding . thrownExceptions , initializerFlowContext , this . scope , FlowInfo . DEAD_END ) ; initializerFlowContext . checkInitializerExceptions ( this . scope , constructorContext , flowInfo ) ; if ( this . binding . declaringClass . isAnonymousType ( ) ) { ArrayList computedExceptions = constructorContext . extendedExceptions ; if ( computedExceptions != null ) { int size ; if ( ( size = computedExceptions . size ( ) ) > 0 ) { ReferenceBinding [ ] actuallyThrownExceptions ; computedExceptions . toArray ( ( actuallyThrownExceptions = new ReferenceBinding [ size ] ) ) ; this . binding . thrownExceptions = actuallyThrownExceptions ; } } } if ( ( this . arguments ) != null ) { for ( int i = 0 , count = this . arguments . length ; i < count ; i ++ ) { flowInfo . markAsDefinitelyAssigned ( this . arguments [ i ] . binding ) ; } } if ( ( this . constructorCall ) != null ) { if ( ( this . constructorCall . accessMode ) == ( ExplicitConstructorCall . This ) ) { FieldBinding [ ] fields = this . binding . declaringClass . fields ( ) ; for ( int i = 0 , count = fields . length ; i < count ; i ++ ) { FieldBinding field ; if ( ! ( ( field = fields [ i ] ) . isStatic ( ) ) ) { flowInfo . markAsDefinitelyAssigned ( field ) ; } } } flowInfo = this . constructorCall . analyseCode ( this . scope , constructorContext , flowInfo ) ; } flowInfo . setReachMode ( nonStaticFieldInfoReachMode ) ; if ( ( this . statements ) != null ) { int complaintLevel = ( ( nonStaticFieldInfoReachMode & ( FlowInfo . UNREACHABLE ) ) == 0 ) ? Statement . NOT_COMPLAINED : Statement . COMPLAINED_FAKE_REACHABLE ; for ( int i = 0 , count = this . statements . length ; i < count ; i ++ ) { Statement stat = this . statements [ i ] ; if ( ( complaintLevel = stat . complainIfUnreachable ( flowInfo , this . scope , complaintLevel ) ) < ( Statement . COMPLAINED_UNREACHABLE ) ) { flowInfo = stat . analyseCode ( this . scope , constructorContext , flowInfo ) ; } } } if ( ( ( flowInfo . tagBits ) & ( FlowInfo . UNREACHABLE ) ) == 0 ) { this . bits |= ASTNode . NeedFreeReturn ; } flowInfo . setReachMode ( initialReachMode ) ; if ( ( ( this . constructorCall ) != null ) && ( ( this . constructorCall . accessMode ) != ( ExplicitConstructorCall . This ) ) ) { flowInfo = flowInfo . mergedWith ( constructorContext . initsOnReturn ) ; FieldBinding [ ] fields = this . binding . declaringClass . fields ( ) ; for ( int i = 0 , count = fields . length ; i < count ; i ++ ) { FieldBinding field ; if ( ( ( ! ( ( field = fields [ i ] ) . isStatic ( ) ) ) && ( field . isFinal ( ) ) ) && ( ! ( flowInfo . isDefinitelyAssigned ( fields [ i ] ) ) ) ) { this . scope . problemReporter ( ) . uninitializedBlankFinalField ( field , ( ( ( this . bits ) & ( ASTNode . IsDefaultConstructor ) ) != 0 ? ( ( ASTNode ) ( this . scope . referenceType ( ) ) ) : this ) ) ; } } } constructorContext . complainIfUnusedExceptionHandlers ( this ) ; this . scope . checkUnusedParameters ( this . binding ) ; } catch ( org . eclipse . jdt . internal . compiler . problem . AbortMethod e ) { this . ignoreFurtherInvestigation = true ; } } public void generateCode ( ClassScope classScope , ClassFile classFile ) { } public void generateSyntheticFieldInitializationsIfNecessary ( MethodScope methodScope , CodeStream codeStream , ReferenceBinding declaringClass ) { } private void internalGenerateCode ( ClassScope classScope , ClassFile classFile ) { } public boolean isConstructor ( ) { } public boolean isDefaultConstructor ( ) { } public boolean isInitializationMethod ( ) { } public boolean isRecursive ( ArrayList visited ) { } public void parseStatements ( Parser parser , CompilationUnitDeclaration unit ) { }

Fix:
if ( ! ( constructorBinding . isOrEnclosedByPrivateType ( ) ) ) {