Skip to content

Commit

Permalink
WI #2611 Add diagnostic for invalid usage/picture combinations (#2613)
Browse files Browse the repository at this point in the history
  • Loading branch information
fm-117 committed Jan 29, 2024
1 parent 776107b commit 0053131
Show file tree
Hide file tree
Showing 6 changed files with 194 additions and 119 deletions.
26 changes: 0 additions & 26 deletions TypeCobol.Test/Parser/Programs/TypeCobol/UsageComp1-2.PGM.txt

This file was deleted.

83 changes: 0 additions & 83 deletions TypeCobol.Test/Parser/Programs/TypeCobol/UsageComp1-2.SYM.txt

This file was deleted.

38 changes: 38 additions & 0 deletions TypeCobol.Test/Parser/Programs/TypeCobol/UsageStandalone.PGM.txt
@@ -0,0 +1,38 @@
--- Diagnostics ---
Line 5[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar1]<UserDefinedWord>
Line 6[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar2]<UserDefinedWord>
Line 7[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar3]<UserDefinedWord>
Line 8[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar4]<UserDefinedWord>
Line 9[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar5]<UserDefinedWord>
Line 10[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar6]<UserDefinedWord>
Line 11[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar7]<UserDefinedWord>
Line 17[21,25] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[21,25:var23]<UserDefinedWord>
Line 18[21,25] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[21,25:var24]<UserDefinedWord>
Line 19[21,25] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[21,25:var25]<UserDefinedWord>

--- Program ---
PROGRAM: DVZF0OSM common:False initial:False recursive:False
author: ? written: ? compiled: ? installation: ? security: ?
--- Intrinsic:Namespace:Program:Global:Local
-- DATA --------
MyVar1:Numeric
MyVar2:Numeric
MyVar3:Numeric
MyVar4:Numeric
MyVar5:Numeric
MyVar6:Numeric
MyVar7:Numeric
-- FUNCTIONS ---
KONotCorrectFormat
in: var21:Numeric
in: var22:Numeric
in: var23:Numeric
in: var24:Numeric
in: var25:Numeric
in: var26:Numeric
--- Intrinsic
-- TYPES -------
BOOL:BOOL
DATE:DATE
CURRENCY:CURRENCY
STRING:STRING
143 changes: 143 additions & 0 deletions TypeCobol.Test/Parser/Programs/TypeCobol/UsageStandalone.SYM.txt
@@ -0,0 +1,143 @@
--- Diagnostics ---
Line 5[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar1]<UserDefinedWord>
Line 6[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar2]<UserDefinedWord>
Line 7[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar3]<UserDefinedWord>
Line 8[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar4]<UserDefinedWord>
Line 9[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar5]<UserDefinedWord>
Line 10[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar6]<UserDefinedWord>
Line 11[11,16] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[11,16:MyVar7]<UserDefinedWord>
Line 17[21,25] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[21,25:var23]<UserDefinedWord>
Line 18[21,25] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[21,25:var24]<UserDefinedWord>
Line 19[21,25] <27, Error, Syntax> - Syntax error : Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE OffendingSymbol=[21,25:var25]<UserDefinedWord>

--- Program ---
DVZF0OSM (.NET Type=ProgramSymbol, Kind=Program)
Type:
(.NET Type=ScopeType, Tag=Scope)
WorkingStorageData:
MyVar1 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [WORKING_STORAGE]
Owner: DVZF0OSM
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Comp1
Picture: 9(5)
Level: 1
IsFiller: False
MyVar2 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [WORKING_STORAGE]
Owner: DVZF0OSM
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Comp2
Picture: 9(5)
Level: 1
IsFiller: False
MyVar3 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [WORKING_STORAGE]
Owner: DVZF0OSM
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Index
Picture: 9(4)
Level: 1
IsFiller: False
MyVar4 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [WORKING_STORAGE]
Owner: DVZF0OSM
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Pointer
Picture: 9(4)
Level: 1
IsFiller: False
MyVar5 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [WORKING_STORAGE]
Owner: DVZF0OSM
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Pointer32
Picture: 9(4)
Level: 1
IsFiller: False
MyVar6 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [WORKING_STORAGE]
Owner: DVZF0OSM
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: ProcedurePointer
Picture: 9(8)
Level: 1
IsFiller: False
MyVar7 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [WORKING_STORAGE]
Owner: DVZF0OSM
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: FunctionPointer
Picture: 9(4)
Level: 1
IsFiller: False
Functions:
KONotCorrectFormat (.NET Type=FunctionSymbol, Kind=Function)
Flags: [Private]
Owner: DVZF0OSM
Type:
(.NET Type=ScopeType, Tag=Scope)
Parameters: [DVZF0OSM::KONotCorrectFormat::var21, DVZF0OSM::KONotCorrectFormat::var22, DVZF0OSM::KONotCorrectFormat::var23, DVZF0OSM::KONotCorrectFormat::var24, DVZF0OSM::KONotCorrectFormat::var25, DVZF0OSM::KONotCorrectFormat::var26]
LinkageData:
var21 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [LINKAGE, Input, Parameter]
Owner: DVZF0OSM::KONotCorrectFormat
Type:
(.NET Type=PictureType, Tag=Picture)
Picture: S(1)9(5)
Level: 1
IsFiller: False
var22 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [LINKAGE, Input, Parameter]
Owner: DVZF0OSM::KONotCorrectFormat
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Comp
Picture: S(1)9(6)
Level: 1
IsFiller: False
var23 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [LINKAGE, Input, Parameter]
Owner: DVZF0OSM::KONotCorrectFormat
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Comp1
Picture: S(1)9(7)
Level: 1
IsFiller: False
var24 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [LINKAGE, Input, Parameter]
Owner: DVZF0OSM::KONotCorrectFormat
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Comp2
Picture: S(1)9(8)
Level: 1
IsFiller: False
var25 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [LINKAGE, Input, Parameter]
Owner: DVZF0OSM::KONotCorrectFormat
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Index
Picture: 9(4)
Level: 1
IsFiller: False
var26 (.NET Type=VariableSymbol, Kind=Variable)
Flags: [LINKAGE, Input, Parameter]
Owner: DVZF0OSM::KONotCorrectFormat
Type:
(.NET Type=PictureType, Tag=Picture)
Usage: Comp5
Picture: 9(10)
Level: 1
IsFiller: False
IsNested: False

Expand Up @@ -4,14 +4,21 @@
WORKING-STORAGE SECTION.
01 MyVar1 PIC 9(5) COMP-1.
01 MyVar2 PIC 9(5) COMP-2.
01 MyVar3 PIC 9(4) INDEX.
01 MyVar4 PIC 9(4) POINTER.
01 MyVar5 PIC 9(4) POINTER-32.
01 MyVar6 PIC 9(8) PROCEDURE-POINTER.
01 MyVar7 PIC 9(4) FUNCTION-POINTER.
PROCEDURE DIVISION.

declare procedure KONotCorrectFormat private
input var21 pic S9(5)
var22 pic S9(06) comp
var23 pic S9(07) comp-1
var24 pic S9(08) comp-2
var25 pic 9(10) comp-5.
var25 pic 9(04) index
* POINTER-like vars are not allowed as TC function parameter
var26 pic 9(10) comp-5.
end-declare.

END PROGRAM DVZF0OSM.
14 changes: 5 additions & 9 deletions TypeCobol/Compiler/Diagnostics/CrossChecker.cs
@@ -1,7 +1,4 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Linq;
using TypeCobol.Compiler.CodeElements;
using TypeCobol.Compiler.CodeElements.Expressions;
using TypeCobol.Compiler.CodeModel;
Expand Down Expand Up @@ -839,7 +836,7 @@ public override bool Visit(DataDefinition dataDefinition)
&& dataDefinition.Picture == null
//commonDataDataDefinitionCodeElement.UserDefinedDataType is the type as written in the code. dataDefinition.TypeDefinition is the resolved type which can be null if the type cannot be found
&& commonDataDataDefinitionCodeElement.UserDefinedDataType == null
&& (!dataDefinition.Usage.HasValue || !IsUsageAllowedWithoutPicture(dataDefinition.Usage.Value)))
&& (!dataDefinition.Usage.HasValue || !IsUsageStandalone(dataDefinition.Usage.Value)))
{
DiagnosticUtils.AddError(dataDefinition, "A group item cannot be empty. Add children, picture or valid usage (INDEX, COMP-1, COMP-2, POINTER, POINTER-32, PROCEDURE-POINTER or FUNCTION-POINTER).", commonDataDataDefinitionCodeElement);

Expand All @@ -849,17 +846,16 @@ public override bool Visit(DataDefinition dataDefinition)
}

var usage = commonDataDataDefinitionCodeElement?.Usage;
if (usage != null && (usage.Value == DataUsage.FloatingPoint || usage.Value == DataUsage.LongFloatingPoint) &&
commonDataDataDefinitionCodeElement.Picture != null)
if (usage != null && IsUsageStandalone(usage.Value) && commonDataDataDefinitionCodeElement.Picture != null)
{
DiagnosticUtils.AddError(dataDefinition,
"Variable with usage COMP-1 and COMP-2 cannot have a PICTURE", commonDataDataDefinitionCodeElement);
"Variable with usage COMP-1, COMP-2, INDEX, POINTER, POINTER-32, PROCEDURE-POINTER and FUNCTION-POINTER cannot have a PICTURE", commonDataDataDefinitionCodeElement);
}


return true;

static bool IsUsageAllowedWithoutPicture(DataUsage usage)
// Return true for usages which cannot have a PICTURE, false for usages requiring a PICTURE
static bool IsUsageStandalone(DataUsage usage)
{
switch (usage)
{
Expand Down

0 comments on commit 0053131

Please sign in to comment.