mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 16:39:24 +01:00 
			
		
		
		
	compiler: don't allow unit/namespace symbols be visible outside current unit or unit of currently specialized generic
git-svn-id: trunk@25559 -
This commit is contained in:
		
							parent
							
								
									44b141ea1a
								
							
						
					
					
						commit
						d373ad27bc
					
				@ -1320,7 +1320,7 @@ implementation
 | 
			
		||||
 | 
			
		||||
    function tabstractrecordsymtable.iscurrentunit: boolean;
 | 
			
		||||
      begin
 | 
			
		||||
        Result := Assigned(current_module) and (current_module.moduleid=moduleid);
 | 
			
		||||
        Result:=assigned(current_module)and(current_module.moduleid=moduleid);
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
{****************************************************************************
 | 
			
		||||
@ -1814,7 +1814,7 @@ implementation
 | 
			
		||||
 | 
			
		||||
    function tspecializesymtable.iscurrentunit: boolean;
 | 
			
		||||
      begin
 | 
			
		||||
        Result := true;
 | 
			
		||||
        Result:=true;
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2335,9 +2335,9 @@ implementation
 | 
			
		||||
 | 
			
		||||
    function  searchsym_maybe_with_symoption(const s : TIDString;out srsym:tsym;out srsymtable:TSymtable;flags:tsymbol_search_flags;option:tsymoption):boolean;
 | 
			
		||||
      var
 | 
			
		||||
        hashedid   : THashedIDString;
 | 
			
		||||
        contextstructdef : tabstractrecorddef;
 | 
			
		||||
        stackitem  : psymtablestackitem;
 | 
			
		||||
        hashedid: THashedIDString;
 | 
			
		||||
        contextstructdef: tabstractrecorddef;
 | 
			
		||||
        stackitem: psymtablestackitem;
 | 
			
		||||
      begin
 | 
			
		||||
        result:=false;
 | 
			
		||||
        hashedid.id:=s;
 | 
			
		||||
@ -2363,7 +2363,16 @@ implementation
 | 
			
		||||
              (srsymtable.defowner.typ=undefineddef)) then
 | 
			
		||||
              begin
 | 
			
		||||
                srsym:=tsym(srsymtable.FindWithHash(hashedid));
 | 
			
		||||
                if assigned(srsym) then
 | 
			
		||||
                { First check if it is a unit/namespace symbol.
 | 
			
		||||
                  They are visible only if they are from the current unit or
 | 
			
		||||
                  unit of generic of currently processed specialization. }
 | 
			
		||||
                if assigned(srsym) and
 | 
			
		||||
                   (
 | 
			
		||||
                     not(srsym.typ in [unitsym,namespacesym]) or
 | 
			
		||||
                     srsymtable.iscurrentunit or
 | 
			
		||||
                     (assigned(current_specializedef)and(current_specializedef.genericdef.owner.moduleid=srsymtable.moduleid))
 | 
			
		||||
                   ) and
 | 
			
		||||
                   (not (ssf_search_option in flags) or (option in srsym.symoptions))then
 | 
			
		||||
                  begin
 | 
			
		||||
                    { use the class from withsymtable only when it is
 | 
			
		||||
                      defined in this unit }
 | 
			
		||||
@ -2375,9 +2384,8 @@ implementation
 | 
			
		||||
                      contextstructdef:=tabstractrecorddef(srsymtable.defowner)
 | 
			
		||||
                    else
 | 
			
		||||
                      contextstructdef:=current_structdef;
 | 
			
		||||
                    if not (srsym.owner.symtabletype in [objectsymtable,recordsymtable]) or
 | 
			
		||||
                       is_visible_for_object(srsym,contextstructdef) and
 | 
			
		||||
                       (not (ssf_search_option in flags) or (option in srsym.symoptions)) then
 | 
			
		||||
                    if not(srsym.owner.symtabletype in [objectsymtable,recordsymtable]) or
 | 
			
		||||
                       is_visible_for_object(srsym,contextstructdef) then
 | 
			
		||||
                      begin
 | 
			
		||||
                        { we need to know if a procedure references symbols
 | 
			
		||||
                          in the static symtable, because then it can't be
 | 
			
		||||
@ -2444,7 +2452,11 @@ implementation
 | 
			
		||||
              begin
 | 
			
		||||
                srsym:=tsym(srsymtable.FindWithHash(hashedid));
 | 
			
		||||
                if assigned(srsym) and
 | 
			
		||||
                   (not(srsym.typ in [unitsym,namespacesym]) or srsymtable.iscurrentunit) and
 | 
			
		||||
                   (
 | 
			
		||||
                     not(srsym.typ in [unitsym,namespacesym]) or
 | 
			
		||||
                     srsymtable.iscurrentunit or
 | 
			
		||||
                     (assigned(current_specializedef)and(current_specializedef.genericdef.owner.moduleid=srsymtable.moduleid))
 | 
			
		||||
                   ) and
 | 
			
		||||
                   not(srsym.typ in [fieldvarsym,paravarsym,propertysym,procsym,labelsym]) and
 | 
			
		||||
                   (not (srsym.owner.symtabletype in [objectsymtable,recordsymtable]) or is_visible_for_object(srsym,current_structdef)) then
 | 
			
		||||
                  begin
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user