Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 53581 Details for
Bug 159939
[1.5][compiler] Eclipse allows List<void[]>, javac doesn't
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Proposed fix
patch_159939.txt (text/plain), 21.33 KB, created by
Olivier Thomann
on 2006-11-09 15:20:14 EST
(
hide
)
Description:
Proposed fix
Filename:
MIME Type:
Creator:
Olivier Thomann
Created:
2006-11-09 15:20:14 EST
Size:
21.33 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jdt.core >Index: compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java,v >retrieving revision 1.140 >diff -u -r1.140 SourceTypeBinding.java >--- compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java 30 Oct 2006 10:56:45 -0000 1.140 >+++ compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java 9 Nov 2006 20:23:58 -0000 >@@ -1361,7 +1361,7 @@ > methodDecl.scope.problemReporter().argumentTypeCannotBeVoid(this, methodDecl, arg); > foundArgProblem = true; > } else if (parameterType.isArrayType() && ((ArrayBinding) parameterType).leafComponentType == TypeBinding.VOID) { >- methodDecl.scope.problemReporter().argumentTypeCannotBeVoidArray(this, methodDecl, arg); >+ methodDecl.scope.problemReporter().argumentTypeCannotBeVoidArray(arg); > foundArgProblem = true; > } else { > TypeBinding leafType = parameterType.leafComponentType(); >@@ -1386,7 +1386,7 @@ > if (methodType == null) { > foundReturnTypeProblem = true; > } else if (methodType.isArrayType() && ((ArrayBinding) methodType).leafComponentType == TypeBinding.VOID) { >- methodDecl.scope.problemReporter().returnTypeCannotBeVoidArray(this, (MethodDeclaration) methodDecl); >+ methodDecl.scope.problemReporter().returnTypeCannotBeVoidArray((MethodDeclaration) methodDecl); > foundReturnTypeProblem = true; > } else { > method.returnType = methodType; >Index: compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties,v >retrieving revision 1.211 >diff -u -r1.211 messages.properties >--- compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties 19 Oct 2006 08:19:53 -0000 1.211 >+++ compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties 9 Nov 2006 20:24:00 -0000 >@@ -39,8 +39,8 @@ > 50 = {0} cannot be resolved > 51 = The local variable {0} may not have been initialized > 52 = void is an invalid type for the variable {0} >-53 = An array of void is an invalid type for the variable {0} >-54 = An array of void is an invalid type >+###[obsolete] 53 = An array of void is an invalid type for the variable {0} >+54 = void[] is an invalid type > 55 = Duplicate local variable {0} > 56 = Duplicate parameter {0} > 57 = The final local variable {0} may already have been assigned >@@ -286,8 +286,8 @@ > 362 = The abstract method {1} in type {0} can only set a visibility modifier, one of public or protected > 363 = The abstract method {1} in type {0} can only be defined by an abstract class > 364 = void is an invalid type for the parameter {1} of the method {0} >-365 = An array of void is an invalid type for the parameter {1} of the method {0} >-366 = An array of void is an invalid return type for the method {0} >+###[obsolete] 365 = An array of void is an invalid type for the parameter {1} of the method {0} >+###[obsolete] 366 = An array of void is an invalid return type for the method {0} > 367 = The native method {1} cannot also be declared strictfp > 368 = Duplicate modifier for parameter {0} > >Index: compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java,v >retrieving revision 1.325 >diff -u -r1.325 ProblemReporter.java >--- compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java 19 Oct 2006 08:19:34 -0000 1.325 >+++ compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java 9 Nov 2006 20:24:00 -0000 >@@ -635,14 +635,13 @@ > methodDecl.sourceStart, > methodDecl.sourceEnd); > } >-public void argumentTypeCannotBeVoidArray(SourceTypeBinding type, AbstractMethodDeclaration methodDecl, Argument arg) { >- String[] arguments = new String[] {new String(methodDecl.selector), new String(arg.name)}; >+public void argumentTypeCannotBeVoidArray(Argument arg) { > this.handle( >- IProblem.ArgumentTypeCannotBeVoidArray, >- arguments, >- arguments, >- methodDecl.sourceStart, >- methodDecl.sourceEnd); >+ IProblem.CannotAllocateVoidArray, >+ NoArgument, >+ NoArgument, >+ arg.type.sourceStart, >+ arg.type.sourceEnd); > } > public void arrayConstantsOnlyInArrayInitializers(int sourceStart, int sourceEnd) { > this.handle( >@@ -5356,14 +5355,13 @@ > arrayRef.sourceStart, > arrayRef.sourceEnd); > } >-public void returnTypeCannotBeVoidArray(SourceTypeBinding type, MethodDeclaration methodDecl) { >- String[] arguments = new String[] {new String(methodDecl.selector)}; >+public void returnTypeCannotBeVoidArray(MethodDeclaration methodDecl) { > this.handle( >- IProblem.ReturnTypeCannotBeVoidArray, >- arguments, >- arguments, >- methodDecl.sourceStart, >- methodDecl.sourceEnd); >+ IProblem.CannotAllocateVoidArray, >+ NoArgument, >+ NoArgument, >+ methodDecl.returnType.sourceStart, >+ methodDecl.returnType.sourceEnd); > } > public void scannerError(Parser parser, String errorTokenName) { > Scanner scanner = parser.scanner; >@@ -6414,13 +6412,12 @@ > varDecl.sourceEnd); > } > public void variableTypeCannotBeVoidArray(AbstractVariableDeclaration varDecl) { >- String[] arguments = new String[] {new String(varDecl.name)}; > this.handle( >- IProblem.VariableTypeCannotBeVoidArray, >- arguments, >- arguments, >- varDecl.sourceStart, >- varDecl.sourceEnd); >+ IProblem.CannotAllocateVoidArray, >+ NoArgument, >+ NoArgument, >+ varDecl.type.sourceStart, >+ varDecl.type.sourceEnd); > } > public void visibilityConflict(MethodBinding currentMethod, MethodBinding inheritedMethod) { > this.handle( >Index: compiler/org/eclipse/jdt/core/compiler/IProblem.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java,v >retrieving revision 1.182 >diff -u -r1.182 IProblem.java >--- compiler/org/eclipse/jdt/core/compiler/IProblem.java 19 Oct 2006 08:19:30 -0000 1.182 >+++ compiler/org/eclipse/jdt/core/compiler/IProblem.java 9 Nov 2006 20:23:57 -0000 >@@ -288,6 +288,7 @@ > int UndefinedName = Internal + FieldRelated + 50; > int UninitializedLocalVariable = Internal + 51; > int VariableTypeCannotBeVoid = Internal + 52; >+ /** @deprecated - problem is no longer generated, use {@link #CannotAllocateVoidArray} instead */ > int VariableTypeCannotBeVoidArray = Internal + 53; > int CannotAllocateVoidArray = Internal + 54; > // local variables >@@ -447,7 +448,7 @@ > int SuperfluousSemicolon = Internal + 180; > /** @since 3.0 */ > int UnnecessaryCast = Internal + TypeRelated + 181; >- /** @deprecated - no longer generated, simply treated as UnnecessaryCast >+ /** @deprecated - no longer generated, use {@link #UnnecessaryCast} instead > * @since 3.0 */ > int UnnecessaryArgumentCast = Internal + TypeRelated + 182; > /** @since 3.0 */ >@@ -597,26 +598,26 @@ > /** @since 3.1 */ > int ObjectMustBeClass = Internal + 330; > >- /** @deprecated - problem is no longer generated, UndefinedType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */ > int SuperclassNotFound = TypeRelated + 329 + ProblemReasons.NotFound; // TypeRelated + 330 >- /** @deprecated - problem is no longer generated, NotVisibleType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */ > int SuperclassNotVisible = TypeRelated + 329 + ProblemReasons.NotVisible; // TypeRelated + 331 >- /** @deprecated - problem is no longer generated, use AmbiguousType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */ > int SuperclassAmbiguous = TypeRelated + 329 + ProblemReasons.Ambiguous; // TypeRelated + 332 >- /** @deprecated - problem is no longer generated, use InternalTypeNameProvided is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */ > int SuperclassInternalNameProvided = TypeRelated + 329 + ProblemReasons.InternalNameProvided; // TypeRelated + 333 >- /** @deprecated - problem is no longer generated, use InheritedTypeHidesEnclosingName is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */ > int SuperclassInheritedNameHidesEnclosingName = TypeRelated + 329 + ProblemReasons.InheritedNameHidesEnclosingName; // TypeRelated + 334 > >- /** @deprecated - problem is no longer generated, UndefinedType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */ > int InterfaceNotFound = TypeRelated + 334 + ProblemReasons.NotFound; // TypeRelated + 335 >- /** @deprecated - problem is no longer generated, NotVisibleType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */ > int InterfaceNotVisible = TypeRelated + 334 + ProblemReasons.NotVisible; // TypeRelated + 336 >- /** @deprecated - problem is no longer generated, use AmbiguousType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */ > int InterfaceAmbiguous = TypeRelated + 334 + ProblemReasons.Ambiguous; // TypeRelated + 337 >- /** @deprecated - problem is no longer generated, use InternalTypeNameProvided is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */ > int InterfaceInternalNameProvided = TypeRelated + 334 + ProblemReasons.InternalNameProvided; // TypeRelated + 338 >- /** @deprecated - problem is no longer generated, use InheritedTypeHidesEnclosingName is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */ > int InterfaceInheritedNameHidesEnclosingName = TypeRelated + 334 + ProblemReasons.InheritedNameHidesEnclosingName; // TypeRelated + 339 > > // field related problems >@@ -628,15 +629,15 @@ > int IllegalModifierCombinationFinalVolatileForField = FieldRelated + 345; > int UnexpectedStaticModifierForField = FieldRelated + 346; > >- /** @deprecated - problem is no longer generated, UndefinedType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */ > int FieldTypeNotFound = FieldRelated + 349 + ProblemReasons.NotFound; // FieldRelated + 350 >- /** @deprecated - problem is no longer generated, NotVisibleType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */ > int FieldTypeNotVisible = FieldRelated + 349 + ProblemReasons.NotVisible; // FieldRelated + 351 >- /** @deprecated - problem is no longer generated, use AmbiguousType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */ > int FieldTypeAmbiguous = FieldRelated + 349 + ProblemReasons.Ambiguous; // FieldRelated + 352 >- /** @deprecated - problem is no longer generated, use InternalTypeNameProvided is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */ > int FieldTypeInternalNameProvided = FieldRelated + 349 + ProblemReasons.InternalNameProvided; // FieldRelated + 353 >- /** @deprecated - problem is no longer generated, use InheritedTypeHidesEnclosingName is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */ > int FieldTypeInheritedNameHidesEnclosingName = FieldRelated + 349 + ProblemReasons.InheritedNameHidesEnclosingName; // FieldRelated + 354 > > // method related problems >@@ -650,42 +651,44 @@ > int IllegalAbstractModifierCombinationForMethod = MethodRelated + 362; > int AbstractMethodInAbstractClass = MethodRelated + 363; > int ArgumentTypeCannotBeVoid = MethodRelated + 364; >+ /** @deprecated - problem is no longer generated, use {@link #CannotAllocateVoidArray} instead */ > int ArgumentTypeCannotBeVoidArray = MethodRelated + 365; >+ /** @deprecated - problem is no longer generated, use {@link #CannotAllocateVoidArray} instead */ > int ReturnTypeCannotBeVoidArray = MethodRelated + 366; > int NativeMethodsCannotBeStrictfp = MethodRelated + 367; > int DuplicateModifierForArgument = MethodRelated + 368; > >- /** @deprecated - problem is no longer generated, UndefinedType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */ > int ArgumentTypeNotFound = MethodRelated + 369 + ProblemReasons.NotFound; // MethodRelated + 370 >- /** @deprecated - problem is no longer generated, NotVisibleType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */ > int ArgumentTypeNotVisible = MethodRelated + 369 + ProblemReasons.NotVisible; // MethodRelated + 371 >- /** @deprecated - problem is no longer generated, use AmbiguousType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */ > int ArgumentTypeAmbiguous = MethodRelated + 369 + ProblemReasons.Ambiguous; // MethodRelated + 372 >- /** @deprecated - problem is no longer generated, use InternalTypeNameProvided is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */ > int ArgumentTypeInternalNameProvided = MethodRelated + 369 + ProblemReasons.InternalNameProvided; // MethodRelated + 373 >- /** @deprecated - problem is no longer generated, use InheritedTypeHidesEnclosingName is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */ > int ArgumentTypeInheritedNameHidesEnclosingName = MethodRelated + 369 + ProblemReasons.InheritedNameHidesEnclosingName; // MethodRelated + 374 > >- /** @deprecated - problem is no longer generated, UndefinedType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */ > int ExceptionTypeNotFound = MethodRelated + 374 + ProblemReasons.NotFound; // MethodRelated + 375 >- /** @deprecated - problem is no longer generated, NotVisibleType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */ > int ExceptionTypeNotVisible = MethodRelated + 374 + ProblemReasons.NotVisible; // MethodRelated + 376 >- /** @deprecated - problem is no longer generated, use AmbiguousType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */ > int ExceptionTypeAmbiguous = MethodRelated + 374 + ProblemReasons.Ambiguous; // MethodRelated + 377 >- /** @deprecated - problem is no longer generated, use InternalTypeNameProvided is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */ > int ExceptionTypeInternalNameProvided = MethodRelated + 374 + ProblemReasons.InternalNameProvided; // MethodRelated + 378 >- /** @deprecated - problem is no longer generated, use InheritedTypeHidesEnclosingName is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */ > int ExceptionTypeInheritedNameHidesEnclosingName = MethodRelated + 374 + ProblemReasons.InheritedNameHidesEnclosingName; // MethodRelated + 379 > >- /** @deprecated - problem is no longer generated, UndefinedType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */ > int ReturnTypeNotFound = MethodRelated + 379 + ProblemReasons.NotFound; // MethodRelated + 380 >- /** @deprecated - problem is no longer generated, NotVisibleType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */ > int ReturnTypeNotVisible = MethodRelated + 379 + ProblemReasons.NotVisible; // MethodRelated + 381 >- /** @deprecated - problem is no longer generated, use AmbiguousType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */ > int ReturnTypeAmbiguous = MethodRelated + 379 + ProblemReasons.Ambiguous; // MethodRelated + 382 >- /** @deprecated - problem is no longer generated, use InternalTypeNameProvided is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */ > int ReturnTypeInternalNameProvided = MethodRelated + 379 + ProblemReasons.InternalNameProvided; // MethodRelated + 383 >- /** @deprecated - problem is no longer generated, use InheritedTypeHidesEnclosingName is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */ > int ReturnTypeInheritedNameHidesEnclosingName = MethodRelated + 379 + ProblemReasons.InheritedNameHidesEnclosingName; // MethodRelated + 384 > > // import related problems >@@ -695,13 +698,13 @@ > int UnusedImport = ImportRelated + 388; > > int ImportNotFound = ImportRelated + 389 + ProblemReasons.NotFound; // ImportRelated + 390 >- /** @deprecated - problem is no longer generated, NotVisibleType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */ > int ImportNotVisible = ImportRelated + 389 + ProblemReasons.NotVisible; // ImportRelated + 391 >- /** @deprecated - problem is no longer generated, use AmbiguousType is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */ > int ImportAmbiguous = ImportRelated + 389 + ProblemReasons.Ambiguous; // ImportRelated + 392 >- /** @deprecated - problem is no longer generated, use InternalTypeNameProvided is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */ > int ImportInternalNameProvided = ImportRelated + 389 + ProblemReasons.InternalNameProvided; // ImportRelated + 393 >- /** @deprecated - problem is no longer generated, use InheritedTypeHidesEnclosingName is used instead */ >+ /** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */ > int ImportInheritedNameHidesEnclosingName = ImportRelated + 389 + ProblemReasons.InheritedNameHidesEnclosingName; // ImportRelated + 394 > > /** @since 3.1 */ >Index: compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java,v >retrieving revision 1.53 >diff -u -r1.53 Argument.java >--- compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java 28 Oct 2006 04:11:27 -0000 1.53 >+++ compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java 9 Nov 2006 20:23:57 -0000 >@@ -108,7 +108,11 @@ > if (exceptionType.isTypeVariable()) { > scope.problemReporter().invalidTypeVariableAsException(exceptionType, this); > return null; >- } >+ } >+ if (exceptionType.isArrayType() && ((ArrayBinding) exceptionType).leafComponentType == TypeBinding.VOID) { >+ scope.problemReporter().variableTypeCannotBeVoidArray(this); >+ return null; >+ } > if (exceptionType.findSuperTypeErasingTo(TypeIds.T_JavaLangThrowable, true) == null) { > scope.problemReporter().cannotThrowType(this.type, exceptionType); > return null; >Index: compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java,v >retrieving revision 1.34 >diff -u -r1.34 TypeReference.java >--- compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java 13 Oct 2006 19:20:45 -0000 1.34 >+++ compiler/org/eclipse/jdt/internal/compiler/ast/TypeReference.java 9 Nov 2006 20:23:57 -0000 >@@ -128,12 +128,17 @@ > return this.resolvedType.isValidBinding() ? this.resolvedType : null; // already reported error > > TypeBinding type = this.resolvedType = getTypeBinding(scope); >- if (this.resolvedType == null) >+ if (type == null) > return null; // detected cycle while resolving hierarchy >- if (!this.resolvedType.isValidBinding()) { >+ if (!type.isValidBinding()) { > reportInvalidType(scope); > return null; > } >+ if (type.isArrayType() && ((ArrayBinding) type).leafComponentType == TypeBinding.VOID) { >+ scope.problemReporter().cannotAllocateVoidArray(this); >+ return null; >+ } >+ > if (isTypeUseDeprecated(type, scope)) > reportDeprecatedType(scope); > >@@ -152,12 +157,16 @@ > return this.resolvedType.isValidBinding() ? this.resolvedType : null; // already reported error > > TypeBinding type = this.resolvedType = getTypeBinding(scope); >- if (this.resolvedType == null) >+ if (type == null) > return null; // detected cycle while resolving hierarchy >- if (!this.resolvedType.isValidBinding()) { >+ if (!type.isValidBinding()) { > reportInvalidType(scope); > return null; > } >+ if (type.isArrayType() && ((ArrayBinding) type).leafComponentType == TypeBinding.VOID) { >+ scope.problemReporter().cannotAllocateVoidArray(this); >+ return null; >+ } > if (isTypeUseDeprecated(type, scope)) > reportDeprecatedType(scope); >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 159939
: 53581 |
53582