summary refs log tree commit diff stats
path: root/compiler/semstmts.nim
Commit message (Collapse)AuthorAgeFilesLines
* Print missing case labels (#10600)Arne Döring2019-02-091-0/+3
|
* Avoid evaluating macros twice in type sections (#10550)LemonBoy2019-02-061-0/+5
| | | Fixes #10548
* gc: destructors is beginning to work (#10483)Andreas Rumpf2019-01-291-1/+2
| | | | | | | | | | | | | | | | * kochdocs.nim: code cleanup * docgen: nicer indentation * parser.nim: code cleanup * fixes #10458 * make tests green again * make =destroy mixins * gc:destructors: produced C code is almost working * --gc:destructors simple program compiles (but leaks memory) * gc:destructors make examples compile in C++ mode * destructors: string implementation bugfixes * strs.nim: minor code cleanup * destructors: builtin seqs are beginning to work * remove debugging helpers
* Harmonize the var/let and const handling (#10410)LemonBoy2019-01-231-4/+14
| | | Fixes #10333
* Fix semantic analysis with noReturn proc in tail pos (#10422)LemonBoy2019-01-231-1/+2
| | | Fixes #10417
* Fix compileTime pragma applying to whole var/let section (#10389)Neelesh Chandola2019-01-221-6/+4
|
* Correct lineinfo for accent quoted symbols in proc definition (#10399)alaviss2019-01-211-10/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * compiler/parser: preserve lineinfo for accent quoted symbols Previously the lineinfo for symbol $$$ in this example is: proc `$$$` ^ After this commit: proc `$$$` ^ * compiler/semstmts: correct lineinfo for accent quoted idents Previously nimsuggest would highlight this as: proc `$$$` ^~~ After this commit: proc `$$$` ^~~ * nimsuggest/tests: add a test for accent quoted proc Disabled by default
* destructors: first step towards fixing #9617 (#10341)cooldome2019-01-181-2/+15
|
* Properly wrap discarded statements (#10322)LemonBoy2019-01-171-10/+14
| | | | | | Failing to do so lead the codegen to emit invalid code sometimes, especially when C++ references were involved. Fixes #10241
* typed/untyped return type is invalid for everything except templates and ↵Neelesh Chandola2019-01-151-3/+0
| | | | macros (#10275)
* add custom pragma support for var and let symbols (#9582)jcosborn2019-01-071-4/+19
| | | | | | * add custom pragma support for var and let symbols * updated changelog for custom pragmas on var and let symbols * add oldast switch for backwards compatibility
* exportc is now not allowed for type aliases (#9979)Neelesh Chandola2019-01-021-0/+2
|
* Deprecate gc v2 (#10151)Neelesh Chandola2019-01-011-1/+1
| | | | | | * Deprecate gc v2 * warnDeprecated now has custom messages
* Check there are no side effects before optimizing away compile time ↵deech2018-12-311-0/+2
| | | | expressions. (#9934)
* Fix const tuple unpacking not working for variables > 2 (#10099)Neelesh Chandola2018-12-271-1/+1
|
* fixes nim-lang/nimsuggest#76 (#10093)alaviss2018-12-251-1/+11
| | | | | | | | * nimsuggest: prevent out-of-bound access * fixes nim-lang/nimsuggest#76 * undo tester changes
* much simpler implementation of constant tuple declarationsAndreas Rumpf2018-12-191-12/+12
|
* Const tuple unpacking (#9964)Neelesh Chandola2018-12-191-19/+41
| | | | | | | | | | * tuple unpacking is now supported for consts * Move nkConstTuple to the end of TNodeKind * Add nnkConstTuple in macros.nim * Fix Formatting
* Fixes #3060 and adds error checking for invalid else branches in object ↵Andreas Rumpf2018-12-191-7/+0
|\ | | | | | | | | | | | | | | | | | | | | | | variants (#9957) * Fix semRecordCase * Fix ftpclient.nim * Check for ordinal type * Check tyRange for exhaustiveness
| * Merge remote-tracking branch 'upstream/devel' into record-caseNeelesh Chandola2018-12-131-1/+3
| |\
| * | Fix semRecordCaseNeelesh Chandola2018-12-131-7/+0
| | |
* | | --gc:destructors: baby stepsAndreas Rumpf2018-12-151-0/+9
| | |
* | | better error message for 'proc' that is not intended to be used as a typeclassAndreas Rumpf2018-12-151-4/+8
| |/ |/|
* | Give error when case has an else branch even though all cases are already ↵Neelesh Chandola2018-12-131-1/+3
|/ | | | | | | | | covered (#9930) * Give error when case has an else branch even though all cases are already covered. * Don't check for invalid else for type tyFloat..tyFloat128, tyString, tyError * Remove unnecessary else in unittest.nim * Fix sockets.nim
* custom pragmas in pragma blocksAndrii Riabushenko2018-12-111-7/+5
|
* Merge pull request #9911 from nc-x/fixes-#9627Andreas Rumpf2018-12-091-7/+23
|\ | | | | `include` now accepts collective arguments
| * `include` now accepts collective argumentsNeelesh Chandola2018-12-091-7/+23
| |
* | fixes nested gensym'ed parameters; fixes #9476Araq2018-12-081-5/+12
|/
* fixes #9614 [backport]Araq2018-12-051-1/+1
|
* fix #9832 (fixup) (#9859)Timothee Cour2018-12-041-1/+2
|
* fixes #9832 (#9841) [backport]Timothee Cour2018-12-041-1/+1
|
* new minor language feature: .noSideEffect blocks like .gcsafe blocksAndreas Rumpf2018-11-271-1/+1
|
* fix #9726 (#9765)Arne Döring2018-11-201-2/+3
|
* added first version of a nimfind tool for the poor souls that don't have a ↵Andreas Rumpf2018-11-141-2/+10
| | | | good nimsuggest integretation
* deprecated ospaths (#9665)Andreas Rumpf2018-11-091-1/+1
|
* fix #8011Arne Döring2018-11-081-1/+5
|
* Nim style checker: document the switch; fixes #9564Araq2018-10-301-1/+7
|
* Change the order of compilation passes, transformation is made lazy at code ↵cooldome2018-10-181-6/+6
| | | | | | | | | | | | | | | gen (#8489) * Ast no transformation * Add getImplNoTransform to the macros module * progress on delaying transf * Fix methods tranformation * Fix lazy lambdalifting * fix create thread wrapper * transform for lambda lifting * improve getImplTransformed * Fix destructor tests * try to fix nimprof for linux
* disallow 'continue' that is not used within a loop; fixes #6367Araq2018-10-181-1/+1
|
* replace deprecated `safeAdd` with `add` (#9416)Miran2018-10-181-1/+1
|
* Merge branch 'Fixes-7845' of https://github.com/cooldome/Nim into ↵Araq2018-10-151-2/+3
|\ | | | | | | cooldome-Fixes-7845
| * Merge branch 'devel' into Fixes-7845cooldome2018-06-261-59/+78
| |\
| * | Fixes 7845cooldome2018-06-101-2/+3
| | |
* | | Fix overload resolution for pragmas evaluation (#8902)LemonBoy2018-10-091-23/+30
| | | | | | | | | | | | Fixes #6448 Fixes #4384
* | | Add checks for except: body blocks (#9191)Dheepak Krishnamurthy2018-10-091-1/+20
| | |
* | | don't require an implementation for procs marked with .error; activate the ↵Araq2018-09-291-1/+1
| | | | | | | | | | | | move optimizer for destructors
* | | fixes #9076Araq2018-09-261-1/+3
| | |
* | | Revert #7964LemonBoy2018-09-211-6/+2
| | | | | | | | | | | | | | | | | | | | | Somehow the test case doesn't crash anymore and the regression in the doc generation is fixed. Fixes #9019
* | | improve the error message for 'attempt to redefine X'; fixes #447Andreas Rumpf2018-09-171-1/+1
| | |
* | | Merge pull request #8949 from nim-lang/araq-for-loop-expressionsAndreas Rumpf2018-09-121-31/+39
|\ \ \ | | | | | | | | For loop expressions
hlt&id=90e9eb3d4fa431ed0e7864caead19cd2e06b2c65'>^
82ac0b7e ^





5f98a10c ^
ac0e9db5 ^

82ac0b7e ^
ae256ea1 ^

5f98a10c ^
e4630643 ^

ae256ea1 ^
82ac0b7e ^
f3760b0f ^
82ac0b7e ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147



                                                                            
 
                   
             



                                                                                     

 
                    
                                                                      

                                                         
                                                   


                          

                                                                                                                            

                                                          
                        

 
                                                                                      


                                                                     
                                     
 
                       
                                                      
 
                                                
                                                               

       
                                                         
                                                                                                           
                                                                                          

                                                                  
                                
                                                             
                                                    
                                                    

                                                 
                                                        
                         
                                                              
                                




                                                                                                                                                   

                 

                                                              
                                                                                                      

                 

                                                                                                                                               
                                            
                                                                                    
                                                                                                                                                                                                               

                 
                                                                                                                                                    




                                                                                                                                                 
                                                                          



     


                                                                              

                                                                                               
                                  
                                                                                                   

                                        


                                                                                                                       
                 


                                                                                   




                                                                            
                                                                                                                              
                                               
                              
                                                                                        
                                                    
                                                                                                    
     
                                                                                                                








                                                                                                
                                                                                   
                       
                                            
                                                                                               





                                                              
                                              

                                                                                                  
                                 

                                          
                                                                                                                                      

                   
                                     
   
                                     
 
//: Writing to a literal (not computed) address of 0 in a recipe chains two
//: spaces together. When a variable has a property of /space:1, it looks up
//: the variable in the chained/surrounding space. /space:2 looks up the
//: surrounding space of the surrounding space, etc.

:(scenario closure)
recipe main [
  default-space:address:shared:array:location <- new location:type, 30
  1:address:shared:array:location/names:new-counter <- new-counter
  2:number/raw <- increment-counter 1:address:shared:array:location/names:new-counter
  3:number/raw <- increment-counter 1:address:shared:array:location/names:new-counter
]

recipe new-counter [
  default-space:address:shared:array:location <- new location:type, 30
  x:number <- copy 23
  y:number <- copy 3  # variable that will be incremented
  reply default-space:address:shared:array:location
]

recipe increment-counter [
  default-space:address:shared:array:location <- new location:type, 30
  0:address:shared:array:location/names:new-counter <- next-ingredient  # outer space must be created by 'new-counter' above
  y:number/space:1 <- add y:number/space:1, 1  # increment
  y:number <- copy 234  # dummy
  reply y:number/space:1
]

+name: lexically surrounding space for recipe increment-counter comes from new-counter
+mem: storing 5 in location 3

//: To make this work, compute the recipe that provides names for the
//: surrounding space of each recipe.

:(before "End Globals")
map<recipe_ordinal, recipe_ordinal> Surrounding_space;

:(before "Transform.push_back(transform_names)")
Transform.push_back(collect_surrounding_spaces);  // idempotent

:(code)
void collect_surrounding_spaces(const recipe_ordinal r) {
  trace(9991, "transform") << "--- collect surrounding spaces for recipe " << get(Recipe, r).name << end();
//?   cerr << "--- collect surrounding spaces for recipe " << get(Recipe, r).name << '\n';
  for (long long int i = 0; i < SIZE(get(Recipe, r).steps); ++i) {
    const instruction& inst = get(Recipe, r).steps.at(i);
    if (inst.is_label) continue;
    for (long long int j = 0; j < SIZE(inst.products); ++j) {
      if (is_literal(inst.products.at(j))) continue;
      if (inst.products.at(j).name != "0") continue;
      type_tree* type = inst.products.at(j).type;
      if (!type
          || type->value != get(Type_ordinal, "address")
          || !type->right
          || type->right->value != get(Type_ordinal, "shared")
          || !type->right->right
          || type->right->right->value != get(Type_ordinal, "array")
          || !type->right->right->right
          || type->right->right->right->value != get(Type_ordinal, "location")
          || type->right->right->right->right) {
        raise_error << "slot 0 should always have type address:shared:array:location, but is " << inst.products.at(j).to_string() << '\n' << end();
        continue;
      }
      string_tree* s = property(inst.products.at(j), "names");
      if (!s) {
        raise_error << "slot 0 requires a /names property in recipe " << get(Recipe, r).name << end();
        continue;
      }
      if (s->right) raise_error << "slot 0 should have a single value in /names, but got " << inst.products.at(j).to_string() << '\n' << end();
      const string& surrounding_recipe_name = s->value;
      if (contains_key(Surrounding_space, r)
          && Surrounding_space[r] != get(Recipe_ordinal, surrounding_recipe_name)) {
        raise_error << "recipe " << get(Recipe, r).name << " can have only one 'surrounding' recipe but has " << get(Recipe, Surrounding_space[r]).name << " and " << surrounding_recipe_name << '\n' << end();
        continue;
      }
      trace(9993, "name") << "lexically surrounding space for recipe " << get(Recipe, r).name << " comes from " << surrounding_recipe_name << end();
//?       cerr << "lexically surrounding space for recipe " << get(Recipe, r).name << " comes from " << surrounding_recipe_name << '\n';
      if (!contains_key(Recipe_ordinal, surrounding_recipe_name)) {
        raise << "can't find recipe providing surrounding space for " << get(Recipe, r).name << ": " << surrounding_recipe_name << '\n' << end();
        continue;
      }
      Surrounding_space[r] = get(Recipe_ordinal, surrounding_recipe_name);
    }
  }
}

//: Once surrounding spaces are available, transform_names uses them to handle
//: /space properties.

:(replace{} "long long int lookup_name(const reagent& r, const recipe_ordinal default_recipe)")
long long int lookup_name(const reagent& x, const recipe_ordinal default_recipe) {
  if (!has_property(x, "space")) {
    if (Name[default_recipe].empty()) raise_error << "name not found: " << x.name << '\n' << end();
    return Name[default_recipe][x.name];
  }
  string_tree* p = property(x, "space");
  if (!p || p->right) raise_error << "/space property should have exactly one (non-negative integer) value\n" << end();
  long long int n = to_integer(p->value);
  assert(n >= 0);
  recipe_ordinal surrounding_recipe = lookup_surrounding_recipe(default_recipe, n);
  set<recipe_ordinal> done;
  vector<recipe_ordinal> path;
  return lookup_name(x, surrounding_recipe, done, path);
}

// If the recipe we need to lookup this name in doesn't have names done yet,
// recursively call transform_names on it.
long long int lookup_name(const reagent& x, const recipe_ordinal r, set<recipe_ordinal>& done, vector<recipe_ordinal>& path) {
  if (!Name[r].empty()) return Name[r][x.name];
  if (contains_key(done, r)) {
    raise_error << "can't compute address of " << x.to_string() << " because " << end();
    for (long long int i = 1; i < SIZE(path); ++i) {
      raise_error << path.at(i-1) << " requires computing names of " << path.at(i) << '\n' << end();
    }
    raise_error << path.at(SIZE(path)-1) << " requires computing names of " << r << "..ad infinitum\n" << end();
    return 0;
  }
  done.insert(r);
  path.push_back(r);
  transform_names(r);  // Not passing 'done' through. Might this somehow cause an infinite loop?
  assert(!Name[r].empty());
  return Name[r][x.name];
}

recipe_ordinal lookup_surrounding_recipe(const recipe_ordinal r, long long int n) {
  if (n == 0) return r;
  if (!contains_key(Surrounding_space, r)) {
    raise_error << "don't know surrounding recipe of " << get(Recipe, r).name << '\n' << end();
    return 0;
  }
  assert(Surrounding_space[r]);
  return lookup_surrounding_recipe(Surrounding_space[r], n-1);
}

//: weaken use-before-set detection just a tad
:(replace{} "bool already_transformed(const reagent& r, const map<string, long long int>& names)")
bool already_transformed(const reagent& r, const map<string, long long int>& names) {
  if (has_property(r, "space")) {
    string_tree* p = property(r, "space");
    if (!p || p->right) {
      raise_error << "/space property should have exactly one (non-negative integer) value in " << r.original_string << '\n' << end();
      return false;
    }
    if (p->value != "0") return true;
  }
  return contains_key(names, r.name);
}