Changes in / [395fc37:1fbab5a]
- Location:
- src
- Files:
-
- 10 edited
-
GenPoly/ScrubTyVars.cc (modified) (2 diffs)
-
Parser/DeclarationNode.cc (modified) (15 diffs)
-
Parser/parser.yy (modified) (5 diffs)
-
ResolvExpr/CommonType.cc (modified) (10 diffs)
-
ResolvExpr/Unify.cc (modified) (3 diffs)
-
SymTab/ImplementationType.cc (modified) (3 diffs)
-
SymTab/Validate.cc (modified) (3 diffs)
-
SynTree/Type.cc (modified) (3 diffs)
-
SynTree/Type.h (modified) (6 diffs)
-
SynTree/TypeSubstitution.cc (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/ScrubTyVars.cc
r395fc37 r1fbab5a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu Mar 16 15:44:27 201713 // Update Count : 312 // Last Modified On : Tue May 19 16:42:42 2015 13 // Update Count : 2 14 14 // 15 15 … … 109 109 if ( Type *dynType = shouldScrub( pointer->get_base() ) ) { 110 110 Type *ret = dynType->acceptMutator( *this ); 111 ret->get_qualifiers() |= pointer->get_qualifiers();111 ret->get_qualifiers() += pointer->get_qualifiers(); 112 112 pointer->set_base( 0 ); 113 113 delete pointer; -
src/Parser/DeclarationNode.cc
r395fc37 r1fbab5a 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 17:16:31201713 // Update Count : 10 1412 // Last Modified On : Thu Mar 16 09:10:57 2017 13 // Update Count : 1007 14 14 // 15 15 … … 19 19 #include <algorithm> 20 20 #include <cassert> 21 #include <strings.h> // ffs 21 22 22 23 #include "TypeData.h" … … 242 243 243 244 DeclarationNode * DeclarationNode::newAggregate( Aggregate kind, const string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) { 244 assert( name );245 245 DeclarationNode * newnode = new DeclarationNode; 246 246 newnode->type = new TypeData( TypeData::Aggregate ); 247 247 newnode->type->aggregate.kind = kind; 248 newnode->type->aggregate.name = name; 248 if ( name ) { 249 newnode->type->aggregate.name = name; 250 } else { // anonymous aggregate ? 251 newnode->type->aggregate.name = new string( anonymous.newName() ); 252 } // if 249 253 newnode->type->aggregate.actuals = actuals; 250 254 newnode->type->aggregate.fields = fields; … … 254 258 255 259 DeclarationNode * DeclarationNode::newEnum( string * name, DeclarationNode * constants, bool body ) { 256 assert( name );257 260 DeclarationNode * newnode = new DeclarationNode; 258 261 newnode->type = new TypeData( TypeData::Enum ); 259 newnode->type->enumeration.name = name; 262 if ( name ) { 263 newnode->type->enumeration.name = name; 264 } else { // anonymous aggregate ? 265 newnode->type->enumeration.name = new string( anonymous.newName() ); 266 } // if 260 267 newnode->type->enumeration.constants = constants; 261 268 newnode->type->enumeration.body = body; … … 429 436 const Type::Qualifiers qsrc = src->qualifiers, qdst = dst->qualifiers; // optimization 430 437 431 if ( (qsrc & qdst).any() ) {// duplicates ?438 if ( (qsrc.val & qdst.val) != 0 ) { // duplicates ? 432 439 for ( unsigned int i = 0; i < Type::NumTypeQualifier; i += 1 ) { // find duplicates 433 440 if ( qsrc[i] && qdst[i] ) { … … 439 446 440 447 void DeclarationNode::checkSpecifiers( DeclarationNode * src ) { 441 if ( (funcSpecs & src->funcSpecs).any() ) {// duplicates ?448 if ( (funcSpecs.val & src->funcSpecs.val) != 0 ) { // duplicates ? 442 449 for ( unsigned int i = 0; i < Type::NumFuncSpecifier; i += 1 ) { // find duplicates 443 450 if ( funcSpecs[i] && src->funcSpecs[i] ) { … … 448 455 449 456 if ( storageClasses.any() && src->storageClasses.any() ) { // any reason to check ? 450 if ( (storageClasses & src->storageClasses ).any()) { // duplicates ?457 if ( (storageClasses.val & src->storageClasses.val ) != 0 ) { // duplicates ? 451 458 for ( unsigned int i = 0; i < Type::NumStorageClass; i += 1 ) { // find duplicates 452 459 if ( storageClasses[i] && src->storageClasses[i] ) { … … 456 463 // src is the new item being added and has a single bit 457 464 } else if ( ! src->storageClasses.is_threadlocal ) { // conflict ? 458 appendError( error, string( "conflicting " ) + Type::StorageClasses::Names[ storageClasses.ffs()] +459 " & " + Type::StorageClasses::Names[ src->storageClasses.ffs()] );460 src->storageClasses. reset(); // FIX to preserve invariant of one basic storage specifier465 appendError( error, string( "conflicting " ) + Type::StorageClasses::Names[ffs( storageClasses.val ) - 1] + 466 " & " + Type::StorageClasses::Names[ffs( src->storageClasses.val ) - 1] ); 467 src->storageClasses.val = 0; // FIX to preserve invariant of one basic storage specifier 461 468 } // if 462 469 } // if … … 466 473 467 474 DeclarationNode * DeclarationNode::copySpecifiers( DeclarationNode * q ) { 468 funcSpecs |= q->funcSpecs;469 storageClasses |= q->storageClasses;475 funcSpecs.val |= q->funcSpecs.val; 476 storageClasses.val |= q->storageClasses.val; 470 477 471 478 for ( Attribute *attr: reverseIterate( q->attributes ) ) { … … 490 497 src = nullptr; 491 498 } else { 492 dst->qualifiers |= src->qualifiers;499 dst->qualifiers += src->qualifiers; 493 500 } // if 494 501 } // addQualifiersToType … … 548 555 switch ( dst->kind ) { 549 556 case TypeData::Unknown: 550 src->qualifiers |= dst->qualifiers;557 src->qualifiers += dst->qualifiers; 551 558 dst = src; 552 559 src = nullptr; 553 560 break; 554 561 case TypeData::Basic: 555 dst->qualifiers |= src->qualifiers;562 dst->qualifiers += src->qualifiers; 556 563 if ( src->kind != TypeData::Unknown ) { 557 564 assert( src->kind == TypeData::Basic ); … … 589 596 dst->base->aggInst.params = maybeClone( src->aggregate.actuals ); 590 597 } // if 591 dst->base->qualifiers |= src->qualifiers;598 dst->base->qualifiers += src->qualifiers; 592 599 src = nullptr; 593 600 break; … … 621 628 type->aggInst.hoistType = o->type->enumeration.body; 622 629 } // if 623 type->qualifiers |= o->type->qualifiers;630 type->qualifiers += o->type->qualifiers; 624 631 } else { 625 632 type = o->type; … … 777 784 p->type->base->aggInst.params = maybeClone( type->aggregate.actuals ); 778 785 } // if 779 p->type->base->qualifiers |= type->qualifiers;786 p->type->base->qualifiers += type->qualifiers; 780 787 break; 781 788 … … 814 821 lastArray->base->aggInst.params = maybeClone( type->aggregate.actuals ); 815 822 } // if 816 lastArray->base->qualifiers |= type->qualifiers;823 lastArray->base->qualifiers += type->qualifiers; 817 824 break; 818 825 default: -
src/Parser/parser.yy
r395fc37 r1fbab5a 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 12:57:03201713 // Update Count : 231 612 // Last Modified On : Thu Mar 16 08:36:17 2017 13 // Update Count : 2310 14 14 // 15 15 … … 1612 1612 aggregate_type: // struct, union 1613 1613 aggregate_key attribute_list_opt '{' field_declaration_list '}' 1614 { $$ = DeclarationNode::newAggregate( $1, n ew string( DeclarationNode::anonymous.newName() ), nullptr, $4, true )->addQualifiers( $2 ); }1614 { $$ = DeclarationNode::newAggregate( $1, nullptr, nullptr, $4, true )->addQualifiers( $2 ); } 1615 1615 | aggregate_key attribute_list_opt no_attr_identifier_or_type_name 1616 1616 { typedefTable.makeTypedef( *$3 ); } … … 1618 1618 { $$ = DeclarationNode::newAggregate( $1, $3, nullptr, $6, true )->addQualifiers( $2 ); } 1619 1619 | aggregate_key attribute_list_opt '(' type_name_list ')' '{' field_declaration_list '}' // CFA 1620 { $$ = DeclarationNode::newAggregate( $1, n ew string( DeclarationNode::anonymous.newName() ), $4, $7, false )->addQualifiers( $2 ); }1620 { $$ = DeclarationNode::newAggregate( $1, nullptr, $4, $7, false )->addQualifiers( $2 ); } 1621 1621 | aggregate_type_nobody 1622 1622 ; … … 1688 1688 // empty 1689 1689 { $$ = DeclarationNode::newName( 0 ); /* XXX */ } // CFA, no field name 1690 // '@' 1691 // { $$ = DeclarationNode::newName( new string( DeclarationNode::anonymous.newName() ) );} // CFA, no field name1690 // '@' // empty 1691 // { $$ = DeclarationNode::newName( 0 ); /* XXX */ } // CFA, no field name 1692 1692 | bit_subrange_size // no field name 1693 1693 { $$ = DeclarationNode::newBitfield( $1 ); } … … 1715 1715 enum_type: // enum 1716 1716 ENUM attribute_list_opt '{' enumerator_list comma_opt '}' 1717 { $$ = DeclarationNode::newEnum( n ew string( DeclarationNode::anonymous.newName() ), $4, true )->addQualifiers( $2 ); }1717 { $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); } 1718 1718 | ENUM attribute_list_opt no_attr_identifier_or_type_name 1719 1719 { typedefTable.makeTypedef( *$3 ); } -
src/ResolvExpr/CommonType.cc
r395fc37 r1fbab5a 10 10 // Created On : Sun May 17 06:59:27 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 16:24:31 201713 // Update Count : 712 // Last Modified On : Wed Mar 2 17:35:34 2016 13 // Update Count : 3 14 14 // 15 15 … … 71 71 if ( unifyExact( type1, type->get_base(), env, have, need, newOpen, indexer ) ) { 72 72 result = type1->clone(); 73 result->get_qualifiers() = tq1 |tq2;73 result->get_qualifiers() = tq1 + tq2; 74 74 } // if 75 75 type1->get_qualifiers() = tq1; … … 133 133 BasicType::Kind newType = combinedType[ basicType->get_kind() ][ otherBasic->get_kind() ]; 134 134 if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= otherBasic->get_qualifiers() ) || widenFirst ) && ( ( newType == otherBasic->get_kind() && basicType->get_qualifiers() <= otherBasic->get_qualifiers() ) || widenSecond ) ) { 135 result = new BasicType( basicType->get_qualifiers() |otherBasic->get_qualifiers(), newType );135 result = new BasicType( basicType->get_qualifiers() + otherBasic->get_qualifiers(), newType ); 136 136 } // if 137 137 } else if ( dynamic_cast< EnumInstType * > ( type2 ) || dynamic_cast< ZeroType* >( type2 ) || dynamic_cast< OneType* >( type2 ) ) { … … 139 139 BasicType::Kind newType = combinedType[ basicType->get_kind() ][ BasicType::SignedInt ]; 140 140 if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= type2->get_qualifiers() ) || widenFirst ) && ( ( newType != basicType->get_kind() && basicType->get_qualifiers() <= type2->get_qualifiers() ) || widenSecond ) ) { 141 result = new BasicType( basicType->get_qualifiers() |type2->get_qualifiers(), newType );141 result = new BasicType( basicType->get_qualifiers() + type2->get_qualifiers(), newType ); 142 142 } // if 143 143 } // if … … 154 154 } 155 155 result = voidPointer->clone(); 156 result->get_qualifiers() |= otherPointer->get_qualifiers();156 result->get_qualifiers() += otherPointer->get_qualifiers(); 157 157 } 158 158 … … 176 176 result = otherPointer->clone(); 177 177 } // if 178 result->get_qualifiers() = tq1 |tq2;178 result->get_qualifiers() = tq1 + tq2; 179 179 } else { 180 180 /// std::cout << "place for ptr-to-type" << std::endl; … … 185 185 } else if ( widenSecond && dynamic_cast< ZeroType* >( type2 ) ) { 186 186 result = pointerType->clone(); 187 result->get_qualifiers() |= type2->get_qualifiers();187 result->get_qualifiers() += type2->get_qualifiers(); 188 188 } // if 189 189 } … … 230 230 if ( unifyExact( type->get_base(), type2, env, have, need, newOpen, indexer ) ) { 231 231 result = type2->clone(); 232 result->get_qualifiers() = tq1 |tq2;232 result->get_qualifiers() = tq1 + tq2; 233 233 } // if 234 234 type2->get_qualifiers() = tq2; … … 250 250 if ( widenSecond || zeroType->get_qualifiers() <= type2->get_qualifiers() ) { 251 251 result = type2->clone(); 252 result->get_qualifiers() |= zeroType->get_qualifiers();252 result->get_qualifiers() += zeroType->get_qualifiers(); 253 253 } 254 254 } else if ( widenSecond && dynamic_cast< OneType* >( type2 ) ) { 255 255 result = new BasicType( zeroType->get_qualifiers(), BasicType::SignedInt ); 256 result->get_qualifiers() |= type2->get_qualifiers();256 result->get_qualifiers() += type2->get_qualifiers(); 257 257 } 258 258 } … … 264 264 if ( widenSecond || oneType->get_qualifiers() <= type2->get_qualifiers() ) { 265 265 result = type2->clone(); 266 result->get_qualifiers() |= oneType->get_qualifiers();266 result->get_qualifiers() += oneType->get_qualifiers(); 267 267 } 268 268 } else if ( widenSecond && dynamic_cast< ZeroType* >( type2 ) ) { 269 269 result = new BasicType( oneType->get_qualifiers(), BasicType::SignedInt ); 270 result->get_qualifiers() |= type2->get_qualifiers();270 result->get_qualifiers() += type2->get_qualifiers(); 271 271 } 272 272 } -
src/ResolvExpr/Unify.cc
r395fc37 r1fbab5a 10 10 // Created On : Sun May 17 12:27:10 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 16:22:54201713 // Update Count : 4 212 // Last Modified On : Thu Mar 16 07:59:59 2017 13 // Update Count : 40 14 14 // 15 15 … … 353 353 #endif 354 354 if ( ( common = commonType( type1, type2, widenMode.widenFirst, widenMode.widenSecond, indexer, env, openVars ) ) ) { 355 common->get_qualifiers() = tq1 |tq2;355 common->get_qualifiers() = tq1 + tq2; 356 356 #ifdef DEBUG 357 357 std::cerr << "unifyInexact: common type is "; … … 370 370 if ( ( tq1 > tq2 || widenMode.widenFirst ) && ( tq2 > tq1 || widenMode.widenSecond ) ) { 371 371 common = type1->clone(); 372 common->get_qualifiers() = tq1 |tq2;372 common->get_qualifiers() = tq1 + tq2; 373 373 result = true; 374 374 } else { -
src/SymTab/ImplementationType.cc
r395fc37 r1fbab5a 10 10 // Created On : Sun May 17 21:32:01 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 15:54:08 201713 // Update Count : 412 // Last Modified On : Wed Mar 2 17:31:20 2016 13 // Update Count : 3 14 14 // 15 15 … … 105 105 if ( typeDecl && typeDecl->get_base() ) { 106 106 Type *base = implementationType( typeDecl->get_base(), indexer ); 107 base->get_qualifiers() |= inst->get_qualifiers();107 base->get_qualifiers() += inst->get_qualifiers(); 108 108 result = base; 109 109 } // if … … 114 114 for ( std::list< Type* >::iterator i = tupleType->get_types().begin(); i != tupleType->get_types().end(); ++i ) { 115 115 Type *implType = implementationType( *i, indexer ); 116 implType->get_qualifiers() |= tupleType->get_qualifiers();116 implType->get_qualifiers() += tupleType->get_qualifiers(); 117 117 newType->get_types().push_back( implType ); 118 118 } // for -
src/SymTab/Validate.cc
r395fc37 r1fbab5a 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 16:39:15201713 // Update Count : 35 312 // Last Modified On : Thu Mar 16 08:02:54 2017 13 // Update Count : 351 14 14 // 15 15 … … 611 611 if ( def != typedefNames.end() ) { 612 612 Type *ret = def->second.first->get_base()->clone(); 613 ret->get_qualifiers() |= typeInst->get_qualifiers();613 ret->get_qualifiers() += typeInst->get_qualifiers(); 614 614 // place instance parameters on the typedef'd type 615 615 if ( ! typeInst->get_parameters().empty() ) { … … 656 656 // hence the type-name "screen" must be defined. 657 657 // Note, qualifiers on the typedef are superfluous for the forward declaration. 658 659 Type *designatorType = tyDecl->get_base()->stripDeclarator(); 660 if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) { 658 if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( tyDecl->get_base() ) ) { 661 659 return new StructDecl( aggDecl->get_name() ); 662 } else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( designatorType) ) {660 } else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( tyDecl->get_base() ) ) { 663 661 return new UnionDecl( aggDecl->get_name() ); 664 } else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( designatorType) ) {662 } else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( tyDecl->get_base() ) ) { 665 663 return new EnumDecl( enumDecl->get_name() ); 666 664 } else { -
src/SynTree/Type.cc
r395fc37 r1fbab5a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 1 6:25:49201713 // Update Count : 2 712 // Last Modified On : Thu Mar 16 10:25:06 2017 13 // Update Count : 23 14 14 // 15 15 … … 19 19 #include "Declaration.h" 20 20 #include "Attribute.h" 21 #include "InitTweak/InitTweak.h"22 21 #include "Common/utility.h" 23 22 … … 65 64 const char * Type::Qualifiers::Names[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic" }; 66 65 67 Type *Type::stripDeclarator() {68 Type * type = this;69 while ( Type * at = InitTweak::getPointerBase( type ) ) {70 type = at;71 }72 return type;73 }74 75 66 void Type::print( std::ostream &os, int indent ) const { 76 67 if ( ! forall.empty() ) { -
src/SynTree/Type.h
r395fc37 r1fbab5a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 1 7:44:11201713 // Update Count : 1 3512 // Last Modified On : Thu Mar 16 12:11:50 2017 13 // Update Count : 116 14 14 // 15 15 … … 21 21 #include "SynTree.h" 22 22 #include "Visitor.h" 23 #include <strings.h> // ffs24 23 25 24 class Type : public BaseSyntaxNode { 26 25 public: 27 // Simulate inheritance because union does not allow it. 28 #define BFCommon( BFType, N ) \ 26 #define CommonBF( N ) \ 29 27 bool operator[]( unsigned int i ) const { return val & (1 << i); } \ 30 28 bool any() const { return val != 0; } \ 31 void reset() { val = 0; } \32 int ffs() { return ::ffs( val ) - 1; } \33 29 static const char * Names[]; \ 34 BFType operator&=( BFType other ) { \35 val &= other.val; return *this; \36 } \37 BFType operator&( BFType other ) const { \38 BFType q = other; \39 q &= *this; \40 return q; \41 } \42 BFType operator|=( BFType other ) { \43 val |= other.val; return *this; \44 } \45 BFType operator|( BFType other ) const { \46 BFType q = other; \47 q |= *this; \48 return q; \49 } \50 BFType operator-=( BFType other ) { \51 val &= ~other.val; return *this; \52 } \53 30 void print( std::ostream & os ) const { \ 54 31 if ( (*this).any() ) { \ … … 73 50 FuncSpecifiers() : val( 0 ) {} 74 51 FuncSpecifiers( unsigned int val ) : val( val ) {} 75 bool operator==( FuncSpecifiers other ) const { return val == other.val; } 76 bool operator!=( FuncSpecifiers other ) const { return val != other.val; } 77 BFCommon( FuncSpecifiers, NumFuncSpecifier ) 52 CommonBF( NumFuncSpecifier ) 78 53 }; // FuncSpecifiers 79 54 … … 91 66 StorageClasses() : val( 0 ) {} 92 67 StorageClasses( unsigned int val ) : val( val ) {} 93 bool operator==( StorageClasses other ) const { return val == other.val; } 94 bool operator!=( StorageClasses other ) const { return val != other.val; } 95 BFCommon( StorageClasses, NumStorageClass ) 68 CommonBF( NumStorageClass ) 96 69 }; // StorageClasses 97 70 … … 119 92 bool operator<=( Qualifiers other ) const { 120 93 return isConst <= other.isConst && isVolatile <= other.isVolatile && 121 isMutex >= other.isMutex && isAtomic == other.isAtomic; 122 } 123 bool operator<( Qualifiers other ) const { return *this != other && *this <= other; } 124 bool operator>=( Qualifiers other ) const { return ! (*this < other); } 125 bool operator>( Qualifiers other ) const { return *this != other && *this >= other; } 126 BFCommon( Qualifiers, NumTypeQualifier ) 94 isMutex == other.isMutex && isAtomic == other.isAtomic; 95 } 96 bool operator>=( Qualifiers other ) const { 97 return isConst >= other.isConst && isVolatile >= other.isVolatile && 98 isMutex == other.isMutex && isAtomic == other.isAtomic; 99 } 100 bool operator<( Qualifiers other ) const { 101 return *this != other && *this <= other; 102 } 103 bool operator>( Qualifiers other ) const { 104 return *this != other && *this >= other; 105 } 106 Qualifiers operator&=( Type::Qualifiers other ) { 107 val &= other.val; return *this; 108 } 109 Qualifiers operator+=( Qualifiers other ) { 110 val |= other.val; return *this; 111 } 112 Qualifiers operator-=( Qualifiers other ) { 113 val &= ~other.val; return *this; 114 } 115 Qualifiers operator+( Qualifiers other ) const { 116 Qualifiers q = other; 117 q += *this; 118 return q; 119 } 120 CommonBF( NumTypeQualifier ) 127 121 }; // Qualifiers 128 122 … … 153 147 virtual bool isVoid() const { return size() == 0; } 154 148 virtual Type * getComponent( unsigned i ) { assertf( size() == 1 && i == 0, "Type::getComponent was called with size %d and index %d\n", size(), i ); return this; } 155 156 Type *stripDeclarator();157 149 158 150 virtual bool isComplete() const { return true; } -
src/SynTree/TypeSubstitution.cc
r395fc37 r1fbab5a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T hu Mar 16 15:54:35 201713 // Update Count : 411 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Apr 26 11:15:29 2016 13 // Update Count : 3 14 14 // 15 15 … … 127 127 subCount++; 128 128 Type *newtype = i->second->clone(); 129 newtype->get_qualifiers() |= inst->get_qualifiers();129 newtype->get_qualifiers() += inst->get_qualifiers(); 130 130 delete inst; 131 131 return newtype;
Note:
See TracChangeset
for help on using the changeset viewer.