| 520 | } |
| 521 | |
| 522 | void ast_globalLetList ( yyscan_t scanner, bool kwd_let, bool glob_shar, bool pub_var, vector<VariableDeclaration*> * list ) { |
| 523 | for ( auto pDecl : *list ) { |
| 524 | if ( pDecl->pTypeDecl ) { |
| 525 | for ( const auto & name_at : *pDecl->pNameList ) { |
| 526 | VariablePtr pVar = new Variable(); |
| 527 | pVar->name = name_at.name; |
| 528 | pVar->aka = name_at.aka; |
| 529 | if ( !name_at.aka.empty() ) { |
| 530 | das_yyerror(scanner,"global variable " + name_at.name + " can't have an aka",name_at.at, |
| 531 | CompilationError::invalid_global_aka); |
| 532 | } |
| 533 | pVar->at = name_at.at; |
| 534 | if ( pDecl->pNameList->size()>1 ) { |
| 535 | pVar->type = new TypeDecl(*pDecl->pTypeDecl); |
| 536 | } else { |
| 537 | pVar->type = pDecl->pTypeDecl; pDecl->pTypeDecl = nullptr; |
| 538 | } |
| 539 | if ( pDecl->pInit ) { |
| 540 | if ( pDecl->pNameList->size()>1 ) { |
| 541 | pVar->init = pDecl->pInit->clone(); |
| 542 | } else { |
| 543 | pVar->init = pDecl->pInit; pDecl->pInit = nullptr; |
| 544 | } |
| 545 | pVar->init_via_move = pDecl->init_via_move; |
| 546 | pVar->init_via_clone = pDecl->init_via_clone; |
| 547 | } |
| 548 | if ( kwd_let ) { |
| 549 | pVar->type->constant = true; |
| 550 | } else { |
| 551 | pVar->type->removeConstant = true; |
| 552 | } |
| 553 | pVar->global_shared = glob_shar; |
| 554 | pVar->private_variable = !pub_var; |
| 555 | if ( pDecl->annotation ) { |
| 556 | pVar->annotation = *pDecl->annotation; |
| 557 | } |
| 558 | if ( !yyextra->g_Program->addVariable(pVar) ) |
| 559 | das_yyerror(scanner,"global variable is already declared " + name_at.name,name_at.at, |
| 560 | CompilationError::already_declared_global); |
| 561 | } |
| 562 | } |
| 563 | } |
| 564 | deleteVariableDeclarationList(list); |
| 565 | } |
| 566 | |
| 567 | void ast_globalBitfieldConst ( yyscan_t scanner, const TypeDeclPtr & bType, bool pub_var, const string & name, Expression * expr ) { |
| 568 | auto pVar = new Variable(); |
no test coverage detected