Bug 567319 - Parser error while editor => build failures popup and editor doesn't start
Summary: Parser error while editor => build failures popup and editor doesn't start
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 4.17   Edit
Hardware: All All
: P3 critical with 2 votes (vote)
Target Milestone: 4.18 M1   Edit
Assignee: Manoj N Palat CLA
QA Contact:
URL:
Whiteboard:
Keywords: regression
: 567191 567571 567583 567795 567967 568140 568178 568422 568556 568606 568724 568806 (view as bug list)
Depends on:
Blocks:
 
Reported: 2020-09-24 07:23 EDT by Mickael Istria CLA
Modified: 2020-11-14 06:49 EST (History)
18 users (show)

See Also:


Attachments
Sample file to reproduce the issue (36.38 KB, text/x-java)
2020-09-24 07:23 EDT, Mickael Istria CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Mickael Istria CLA 2020-09-24 07:23:23 EDT
Created attachment 284247 [details]
Sample file to reproduce the issue

Using SDK with Build id: I20200922-1800 , and working on lemminx-project (specifically the attached file), I get a lot of exceptions that cause error popups and -even more annoying- incapability to open the Java editor.

Here are some interesting exceptions in the log

at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.parseMethods(TypeDeclaration.java:1133)
	at org.eclipse.jdt.internal.compiler.parser.Parser.getMethodBodies(Parser.java:11877)
	at org.eclipse.jdt.internal.compiler.SourceElementParser.parseCompilationUnit(SourceElementParser.java:1138)
	at org.eclipse.jdt.internal.core.CompilationUnit.buildStructure(CompilationUnit.java:195)
	at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:268)
	at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:596)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:326)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:312)
	at org.eclipse.jdt.internal.core.JavaElement.getChildren(JavaElement.java:267)
	at org.eclipse.jdt.internal.core.JavaElement.getChildrenOfType(JavaElement.java:281)
	at org.eclipse.jdt.internal.core.CompilationUnit.getTypes(CompilationUnit.java:968)
	at org.eclipse.jdt.internal.corext.refactoring.util.JavaElementUtil.getMainType(JavaElementUtil.java:99)
	at org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester.getSingleSelectedType(RefactoringAvailabilityTester.java:156)
	at org.eclipse.jdt.ui.actions.ExtractClassAction.selectionChanged(ExtractClassAction.java:85)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchSelectionChanged(SelectionDispatchAction.java:262)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.selectionChanged(SelectionDispatchAction.java:257)
	at org.eclipse.jface.viewers.Viewer$1.run(Viewer.java:151)


java.lang.StringIndexOutOfBoundsException: offset 27112, count -498, length 37253
	at java.base/java.lang.String.checkBoundsOffCount(String.java:3741)
	at java.base/java.lang.String.rangeCheck(String.java:298)
	at java.base/java.lang.String.<init>(String.java:294)
	at org.eclipse.jdt.internal.compiler.parser.Scanner.disambiguatedToken(Scanner.java:5640)
	at org.eclipse.jdt.internal.compiler.parser.Scanner.getNextToken(Scanner.java:1472)
	at org.eclipse.jdt.internal.compiler.parser.diagnose.LexStream.readTokenFromScanner(LexStream.java:84)
	at org.eclipse.jdt.internal.compiler.parser.diagnose.LexStream.token(LexStream.java:154)
	at org.eclipse.jdt.internal.compiler.parser.diagnose.LexStream.kind(LexStream.java:194)
	at org.eclipse.jdt.internal.compiler.parser.diagnose.DiagnoseParser.diagnoseParse(DiagnoseParser.java:312)
	at org.eclipse.jdt.internal.compiler.parser.Parser.reportSyntaxErrors(Parser.java:14062)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:12895)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13204)
	at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.parseStatements(MethodDeclaration.java:225)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.parseMethods(TypeDeclaration.java:1133)
	at org.eclipse.jdt.internal.compiler.parser.Parser.getMethodBodies(Parser.java:11877)
	at org.eclipse.jdt.internal.compiler.SourceElementParser.parseCompilationUnit(SourceElementParser.java:1138)
	at org.eclipse.jdt.internal.core.CompilationUnit.buildStructure(CompilationUnit.java:195)
	at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:268)
	at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:596)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:326)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:312)
	at org.eclipse.jdt.internal.core.JavaElement.getChildren(JavaElement.java:267)
	at org.eclipse.jdt.internal.core.JavaElement.getChildrenOfType(JavaElement.java:281)
	at org.eclipse.jdt.internal.core.CompilationUnit.getTypes(CompilationUnit.java:968)
	at org.eclipse.jdt.internal.corext.refactoring.util.JavaElementUtil.getMainType(JavaElementUtil.java:99)
	at org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester.getSingleSelectedType(RefactoringAvailabilityTester.java:156)
	at org.eclipse.jdt.ui.actions.ExtractClassAction.selectionChanged(ExtractClassAction.java:85)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchSelectionChanged(SelectionDispatchAction.java:262)
Comment 1 Florian Lieb CLA 2020-09-25 05:56:04 EDT
Similar case for me, had to revert to Eclipse 2020-03 to continue working :-(
Comment 2 Roland Grunberg CLA 2020-09-25 13:21:03 EDT
Version: 2020-12 (4.18)
Build id: I20200924-1800

I'm definitely able to reproduce on the I-builds, on 4.17 SDK (2020-09), but the 4.16 SDK (2020-06) seems to not have the issue.

1) I installed m2e (to be sure the project resolves), and imported https://github.com/eclipse/lemminx-maven (as "Projects from Folder or Archive")
2) I opened MavenCompletionParticipant and deleted any brace (eg. '{', '}') or in some cases semicolon, and saw the issue.

I'm able able to reproduce with the following simpler snippet :

!ENTRY org.eclipse.jdt.core 4 4 2020-09-25 13:17:49.999
!MESSAGE Exception occurred during problem detection:
----------------------------------- SOURCE BEGIN -------------------------------------
package foo;

import java.util.ArrayList;

public class Foo {
    public void foo() {
        new ArrayList<>().stream().filter(p -> p != null)
        switch ("") {
        case "":
        }
    }
}
----------------------------------- SOURCE END -------------------------------------
Comment 3 Eclipse Genie CLA 2020-09-29 00:54:20 EDT
New Gerrit change created: https://git.eclipse.org/r/c/jdt/eclipse.jdt.core/+/170002
Comment 4 Manoj N Palat CLA 2020-09-29 01:00:59 EDT
(In reply to Roland Grunberg from comment #2)

Thanks Roland for the test case - could reproduce the issue
Comment 6 Manoj N Palat CLA 2020-09-29 03:37:36 EDT
Thanks Mickael Istria for the bug with the relevant tests.
@Mickael, @Florian - can you please check this one of the I builds that will be built later today/tomorrow?
Comment 7 Mattias Andersson CLA 2020-09-29 11:18:02 EDT
FYI, I have the same problem. In a large java file I had the following code and the missing comma caused the editor to fail saving with the below stack trace. It is however in a switch statement (default:) so maybe the current fix will helper here as well?

   bucketSubscriptions.add(new BucketSubscription(Integer.parseInt(subKey),
      Integer.parseInt(detail.getKeyValue()), <-- REMOVED THE COMMA HERE AND THE EDITOR FAILED TO SAVE. 
      Boolean.parseBoolean(detail.getOldValue())));

Sorry that I cannot give you a smaller example that makes it fail.

Stack trace:

java.lang.StringIndexOutOfBoundsException: offset 14292, count -3247, length 81831
	at java.base/java.lang.String.checkBoundsOffCount(String.java:3741)
	at java.base/java.lang.String.rangeCheck(String.java:298)
	at java.base/java.lang.String.<init>(String.java:294)
	at org.eclipse.jdt.internal.compiler.parser.Scanner.disambiguatedToken(Scanner.java:5491)
	at org.eclipse.jdt.internal.compiler.parser.Scanner.getNextToken(Scanner.java:1461)
	at org.eclipse.jdt.internal.compiler.parser.diagnose.LexStream.readTokenFromScanner(LexStream.java:84)
	at org.eclipse.jdt.internal.compiler.parser.diagnose.LexStream.token(LexStream.java:154)
	at org.eclipse.jdt.internal.compiler.parser.diagnose.LexStream.kind(LexStream.java:194)
	at org.eclipse.jdt.internal.compiler.parser.diagnose.DiagnoseParser.diagnoseParse(DiagnoseParser.java:312)
	at org.eclipse.jdt.internal.compiler.parser.Parser.reportSyntaxErrors(Parser.java:14010)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:12843)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13152)
	at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.parseStatements(MethodDeclaration.java:225)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.parseMethods(TypeDeclaration.java:1138)
	at org.eclipse.jdt.internal.compiler.parser.Parser.getMethodBodies(Parser.java:11825)
	at org.eclipse.jdt.internal.compiler.SourceElementParser.parseCompilationUnit(SourceElementParser.java:1058)
	at org.eclipse.jdt.internal.core.CompilationUnit.buildStructure(CompilationUnit.java:195)
	at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:268)
	at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:596)
	at org.eclipse.jdt.internal.core.CompilationUnit.makeConsistent(CompilationUnit.java:1146)
	at org.eclipse.jdt.internal.core.CompilationUnit.makeConsistent(CompilationUnit.java:1126)
	at org.eclipse.jdt.internal.core.CommitWorkingCopyOperation.executeOperation(CommitWorkingCopyOperation.java:128)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:736)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2317)
	at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:807)
	at org.eclipse.jdt.internal.core.CompilationUnit.commitWorkingCopy(CompilationUnit.java:404)
	at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitDocumentProvider.commitWorkingCopy(CompilationUnitDocumentProvider.java:1418)
	at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitDocumentProvider$3.execute(CompilationUnitDocumentProvider.java:1495)
	at org.eclipse.ui.editors.text.TextFileDocumentProvider$DocumentProviderOperation.run(TextFileDocumentProvider.java:133)
	at org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation.execute(WorkspaceModifyDelegatingOperation.java:71)
	at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:110)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2317)
	at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:131)
	at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:76)
	at org.eclipse.ui.internal.editors.text.WorkspaceOperationRunner.run(WorkspaceOperationRunner.java:66)
	at org.eclipse.ui.editors.text.TextFileDocumentProvider.executeOperation(TextFileDocumentProvider.java:461)
	at org.eclipse.ui.editors.text.TextFileDocumentProvider.saveDocument(TextFileDocumentProvider.java:764)
	at org.eclipse.ui.texteditor.AbstractTextEditor.performSave(AbstractTextEditor.java:5007)
	at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor.performSave(CompilationUnitEditor.java:1268)
	at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor.doSave(CompilationUnitEditor.java:1322)
	at org.eclipse.ui.texteditor.AbstractTextEditor$TextEditorSavable.doSave(AbstractTextEditor.java:7151)
	at org.eclipse.ui.Saveable.doSave(Saveable.java:213)
	at org.eclipse.ui.internal.SaveableHelper.doSaveModel(SaveableHelper.java:333)
	at org.eclipse.ui.internal.SaveableHelper.lambda$1(SaveableHelper.java:196)
	at org.eclipse.ui.internal.SaveableHelper.lambda$3(SaveableHelper.java:271)
	at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:436)
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:352)
	at org.eclipse.ui.internal.WorkbenchWindow.lambda$7(WorkbenchWindow.java:2353)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:74)
	at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2351)
	at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:278)
	at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:260)
	at org.eclipse.ui.internal.SaveableHelper.saveModels(SaveableHelper.java:207)
	at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:150)
	at org.eclipse.ui.internal.WorkbenchPage.saveSaveable(WorkbenchPage.java:3822)
	at org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:3835)
	at org.eclipse.ui.internal.handlers.SaveHandler.execute(SaveHandler.java:81)
	at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:283)
	at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:97)
	at jdk.internal.reflect.GeneratedMethodAccessor59.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58)
	at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:319)
	at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:253)
	at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:173)
	at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:156)
	at org.eclipse.core.commands.Command.executeWithChecks(Command.java:488)
	at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:487)
	at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:213)
	at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:308)
	at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:584)
	at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:653)
	at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:443)
	at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$2(KeyBindingDispatcher.java:386)
	at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:96)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
	at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1254)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1036)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1046)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1088)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1084)
	at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1513)
	at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4881)
	at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:345)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4759)
	at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:340)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4913)
	at org.eclipse.swt.internal.win32.OS.DispatchMessage(Native Method)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3610)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1157)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:644)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:551)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:153)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:150)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:657)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:594)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
Comment 8 Manoj N Palat CLA 2020-09-29 11:34:30 EDT
(In reply to Mattias Andersson from comment #7)
> so maybe the current
> fix will helper here as well?
> 
yes, it will.
Comment 9 Eclipse Genie CLA 2020-10-01 02:37:21 EDT
New Gerrit change created: https://git.eclipse.org/r/c/jdt/eclipse.jdt.core/+/170141
Comment 11 Florian Lieb CLA 2020-10-01 02:52:55 EDT
Confirmed, this fixes the issue. Can't reproduce with I20200930-1800.

Thanks :)
Comment 12 Manoj N Palat CLA 2020-10-01 05:05:24 EDT
(In reply to Florian Lieb from comment #11)
> Confirmed, this fixes the issue. Can't reproduce with I20200930-1800.
> 
> Thanks :)

Thanks Florian for confirming. resolving.
Comment 13 Manoj N Palat CLA 2020-10-01 05:25:30 EDT
Verified for 4.18 M1 as mentioned in comment 11 with I20200930-180
Comment 14 Stéphane B. CLA 2020-10-14 09:05:38 EDT
Thanks for fix. Is this fix will be released for a 4.17 update or does we need to wait for 4.18 ?
Comment 15 Andrey Loskutov CLA 2020-10-23 11:02:05 EDT
*** Bug 567795 has been marked as a duplicate of this bug. ***
Comment 16 Andrey Loskutov CLA 2020-10-23 11:03:14 EDT
*** Bug 567583 has been marked as a duplicate of this bug. ***
Comment 17 Andrey Loskutov CLA 2020-10-23 11:03:42 EDT
*** Bug 567571 has been marked as a duplicate of this bug. ***
Comment 18 Andrey Loskutov CLA 2020-10-23 11:04:45 EDT
*** Bug 567191 has been marked as a duplicate of this bug. ***
Comment 19 Andrey Loskutov CLA 2020-10-23 11:06:19 EDT
*** Bug 568178 has been marked as a duplicate of this bug. ***
Comment 20 Andrey Loskutov CLA 2020-10-23 11:06:56 EDT
*** Bug 568140 has been marked as a duplicate of this bug. ***
Comment 21 Andrey Loskutov CLA 2020-10-23 11:07:36 EDT
*** Bug 567967 has been marked as a duplicate of this bug. ***
Comment 22 Andrey Loskutov CLA 2020-10-23 11:15:20 EDT
For the book keeping: regression in 4.17 M3, from bug 565844 changes.
Comment 23 Andrey Loskutov CLA 2020-11-01 13:34:27 EST
*** Bug 568422 has been marked as a duplicate of this bug. ***
Comment 24 Manoj N Palat CLA 2020-11-01 22:45:53 EST
(In reply to Stéphane B. from comment #14)
> Thanks for fix. Is this fix will be released for a 4.17 update or does we
> need to wait for 4.18 ?

This is available from 4.18 M1 build onwards.
Comment 25 Andrey Loskutov CLA 2020-11-05 06:52:52 EST
*** Bug 568556 has been marked as a duplicate of this bug. ***
Comment 26 Andrey Loskutov CLA 2020-11-06 17:46:56 EST
*** Bug 568606 has been marked as a duplicate of this bug. ***
Comment 27 Andrey Loskutov CLA 2020-11-11 10:53:45 EST
*** Bug 568724 has been marked as a duplicate of this bug. ***
Comment 28 Andrey Loskutov CLA 2020-11-14 06:49:47 EST
*** Bug 568806 has been marked as a duplicate of this bug. ***