Changes in / [126e54f:850fda6]


Ignore:
Location:
src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/DeclarationNode.cc

    r126e54f r850fda6  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Sep  9 23:21:47 2016
    13 // Update Count     : 402
     12// Last Modified On : Mon Aug 29 22:30:56 2016
     13// Update Count     : 327
    1414//
    1515
     
    4343extern LinkageSpec::Spec linkage;                                               // defined in parser.yy
    4444
    45 DeclarationNode::DeclarationNode() :
    46                 type( 0 ),
    47                 storageClass( NoStorageClass ),
    48                 isInline( false ),
    49                 isNoreturn( false ),
    50                 bitfieldWidth( 0 ),
    51                 initializer( 0 ),
    52                 hasEllipsis( false ),
    53                 linkage( ::linkage ),
    54                 extension( false ) {
     45DeclarationNode::DeclarationNode()
     46                : type( 0 )
     47                , storageClass( NoStorageClass )
     48                , isInline( false )
     49                , isNoreturn( false )
     50                , bitfieldWidth( 0 )
     51                , initializer( 0 )
     52                , hasEllipsis( false )
     53                , linkage( ::linkage )
     54                , extension( false )
     55                , error() {
     56        attr.expr = nullptr;
     57        attr.type = nullptr;
     58
    5559        variable.tyClass = DeclarationNode::Type;
    5660        variable.assertions = nullptr;
    57 
    58         attr.expr = nullptr;
    59         attr.type = nullptr;
    6061}
    6162
     
    392393
    393394        if ( (qsrc & qdst).any() ) {                                            // common bits between qualifier masks ?
    394                 for ( int i = 0; i < NoOfQualifier; i += 1 ) {  // find common qualifiers
    395                         if ( qsrc[i] & qdst[i] ) {
    396                                 error += string(error.empty() ? "" : ", ") + "duplicate " + DeclarationNode::qualifierName[i];
     395                error = "duplicate qualifier ";
     396                int j = 0;                                                                              // separator detector
     397                for ( int i = 0; i < DeclarationNode::NoOfQualifier; i += 1 ) {
     398                        if ( qsrc[i] & qdst[i] ) {                                      // find specific qualifiers in common
     399                                if ( j > 0 ) error += ", ";
     400                                error += DeclarationNode::qualifierName[i];
     401                                j += 1;
    397402                        } // if
    398403                } // for
     404                error += " in declaration of ";
    399405        } // if
    400406} // DeclarationNode::checkQualifiers
     
    436442                storageClass = q->storageClass;
    437443        } else if ( q->storageClass != NoStorageClass ) {
    438                 if ( storageClass == q->storageClass ) {
    439                         q->error += string( "duplicate " ) + storageName[ storageClass ];
    440                 } else {                                                                                // can only have one storage class
    441                         q->error += string( "multiple " ) + storageName[ storageClass ] + " & " + storageName[ q->storageClass ];
    442                 } // if
    443         } // if
    444         if ( ! q->error.empty() ) {
    445                 error += (! error.empty() ? ", " : "") + q->error;
    446         } // if
    447         return this;
    448 } // DeclarationNode::copyStorageClasses
     444                q->error = "invalid combination of storage classes in declaration of ";
     445        } // if
     446        if ( error.empty() ) error = q->error;
     447        return this;
     448}
    449449
    450450static void addTypeToType( TypeData *&src, TypeData *&dst ) {
     
    908908
    909909Declaration *DeclarationNode::build() const {
    910         if ( ! error.empty() ) throw SemanticError( error + " in declaration of ", this );
     910        if ( ! error.empty() ) throw SemanticError( error, this );
    911911        if ( type ) {
    912912                if ( type->kind == TypeData::Variable ) {
     
    922922                return (new ObjectDecl( name, storageClass, linkage, maybeBuild< Expression >( bitfieldWidth ), 0, maybeBuild< Initializer >( initializer ) ))->set_extension( extension );
    923923        } // if
    924         throw SemanticError( "invalid function specifier ", this );
     924        throw SemanticError( "invalid function specifier in declaration of ", this );
    925925}
    926926
     
    971971}
    972972
     973// DeclarationNode::StorageClass DeclarationNode::buildStorageClass() const {
     974//      DeclarationNode::StorageClass ret = DeclarationNode::NoStorageClass;
     975//      for ( std::list< DeclarationNode::StorageClass >::const_iterator i = storageClasses.begin(); i != storageClasses.end(); ++i ) {
     976//        if ( *i == DeclarationNode::Inline || *i == DeclarationNode::Noreturn ) continue; // ignore function specifiers
     977//        if ( ret != DeclarationNode::NoStorageClass ) {       // already have a valid storage class ?
     978//                      throw SemanticError( "invalid combination of storage classes in declaration of ", this );
     979//              } // if
     980//              ret = *i;
     981//      } // for
     982//      return ret;
     983// }
     984
     985// bool DeclarationNode::buildFuncSpecifier( DeclarationNode::StorageClass key ) const {
     986//      std::list< DeclarationNode::StorageClass >::const_iterator first = std::find( storageClasses.begin(), storageClasses.end(), key );
     987//   if ( first == storageClasses.end() ) return false; // not found
     988//      first = std::find( ++first, storageClasses.end(), key ); // found
     989//   if ( first == storageClasses.end() ) return true;          // not found again
     990//      throw SemanticError( "duplicate function specifier in declaration of ", this );
     991// }
     992
    973993// Local Variables: //
    974994// tab-width: 4 //
  • src/Parser/ParseNode.h

    r126e54f r850fda6  
    1010// Created On       : Sat May 16 13:28:16 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Sep  8 21:58:06 2016
    13 // Update Count     : 587
     12// Last Modified On : Mon Aug 29 21:45:43 2016
     13// Update Count     : 583
    1414//
    1515
     
    290290        // bool buildFuncSpecifier( StorageClass key ) const;
    291291
     292        struct Enumeration_t {
     293                std::string name;
     294                DeclarationNode * constants;
     295        };
     296        Enumeration_t enumeration;
     297
    292298        struct Variable_t {
    293299                DeclarationNode::TypeClass tyClass;
     
    402408                        if ( result ) {
    403409                                *out++ = result;
     410                        } else {
    404411                        } // if
    405412                } catch( SemanticError &e ) {
  • src/Parser/TypeData.h

    r126e54f r850fda6  
    1010// Created On       : Sat May 16 15:18:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Sep  9 23:20:55 2016
    13 // Update Count     : 117
     12// Last Modified On : Mon Aug 29 22:31:52 2016
     13// Update Count     : 110
    1414//
    1515
     
    9696                Array_t array;
    9797                Enumeration_t enumeration;
    98                 // Variable_t variable;
    9998                Function_t function;
    10099                Symbolic_t symbolic;
    101100                DeclarationNode * tuple;
    102101                ExpressionNode * typeexpr;
    103                 // Attr_t attr;
     102                //Attr_t attr;
    104103                // DeclarationNode::BuiltinType builtin;
    105104
  • src/tests/.expect/declarationErrors.txt

    r126e54f r850fda6  
    11CFA Version 1.0.0 (debug)
    2 Error: duplicate static in declaration of x1: static const volatile short int
     2Error: invalid combination of storage classes in declaration of x9: static const volatile short int
    33
    4 Error: multiple extern & static in declaration of x2: extern const volatile short int
    5 
    6 Error: multiple extern & auto, multiple extern & static, multiple extern & static, duplicate extern in declaration of x3: extern const volatile short int
    7 
    8 Error: duplicate static in declaration of x4: static const volatile instance of const volatile struct __anonymous0
     4Error: invalid combination of storage classes in declaration of x18: static const volatile instance of const volatile struct __anonymous0
    95  with members
    106   with body
    117
    128
    13 Error: duplicate const, duplicate static, duplicate volatile in declaration of x5: static const volatile instance of const volatile struct __anonymous1
     9Error: duplicate qualifier volatile in declaration of x19: static const volatile instance of const volatile struct __anonymous1
    1410  with members
    1511   with body
    1612
    1713
    18 Error: duplicate static in declaration of x6: static const volatile instance of type Int
     14Error: invalid combination of storage classes in declaration of x28: static const volatile instance of type Int
    1915
    20 Error: duplicate const in declaration of f01: static inline function
     16Error: duplicate qualifier const in declaration of f01: static inline function
    2117  with no parameters
    2218  returning const volatile int
    2319
    2420
    25 Error: duplicate volatile in declaration of f02: static inline function
     21Error: duplicate qualifier volatile in declaration of f02: static inline function
    2622  with no parameters
    2723  returning const volatile int
    2824
    2925
    30 Error: duplicate const in declaration of f03: static inline function
     26Error: duplicate qualifier const in declaration of f03: static inline function
    3127  with no parameters
    3228  returning const volatile int
    3329
    3430
    35 Error: duplicate volatile in declaration of f04: static inline function
     31Error: duplicate qualifier volatile in declaration of f04: static inline function
    3632  with no parameters
    3733  returning const volatile int
    3834
    3935
    40 Error: duplicate const in declaration of f05: static inline function
     36Error: duplicate qualifier const in declaration of f05: static inline function
    4137  with no parameters
    4238  returning const volatile int
    4339
    4440
    45 Error: duplicate volatile in declaration of f06: static inline function
     41Error: duplicate qualifier volatile in declaration of f06: static inline function
    4642  with no parameters
    4743  returning const volatile int
    4844
    4945
    50 Error: duplicate const in declaration of f07: static inline function
     46Error: duplicate qualifier const in declaration of f07: static inline function
    5147  with no parameters
    5248  returning const volatile int
    5349
    5450
    55 Error: duplicate const, duplicate volatile in declaration of f08: static inline function
     51Error: duplicate qualifier const, volatile in declaration of f08: static inline function
    5652  with no parameters
    5753  returning const volatile int
    5854
    5955
    60 Error: duplicate const, duplicate volatile in declaration of f09: static inline function
     56Error: duplicate qualifier const, volatile in declaration of f09: static inline function
    6157  with no parameters
    6258  returning const volatile int
    6359
    6460
    65 Error: duplicate const, duplicate _Atomic, duplicate _Atomic, duplicate const, duplicate restrict, duplicate volatile in declaration of f09: static inline function
     61Error: duplicate qualifier const, volatile in declaration of f09: static inline function
    6662  with no parameters
    67   returning const restrict volatile _Atomic int
     63  returning const volatile int
    6864
    6965
  • src/tests/declarationErrors.c

    r126e54f r850fda6  
    1010// Created On       : Wed Aug 17 08:23:43 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Sep  9 22:57:52 2016
    13 // Update Count     : 31
     12// Last Modified On : Thu Aug 25 18:16:40 2016
     13// Update Count     : 5
    1414//
    1515
    16 static short int volatile static const x1;                              // duplicate static
    17 extern short int static volatile const x2;                              // multiple extern & static
    18 extern short int auto static volatile static extern const x3; // duplicate and multiple storage classes
    19 struct { int i; } const static volatile static x4;              // duplicate static
    20 struct { int i; } const static volatile const static volatile x5; // duplicate static & const & volatile
     16static short int volatile static const x9;                              // duplicate static
     17struct { int i; } const static volatile static x18;             // duplicate static
     18struct { int i; } const static volatile static volatile x19; // duplicate static & volatile
    2119typedef int Int;
    22 static Int volatile static const x6;                                    // duplicate static
     20static Int volatile static const x28;                                   // duplicate static
    2321
    2422const static inline const volatile int f01();                   // duplicate const
     
    2624const inline const volatile int static f03();                   // duplicate const
    2725volatile inline static const volatile int f04();                // duplicate volatile
    28 const static int const inline volatile f05();                   // duplicate const
    29 volatile int static const volatile inline f06();                // duplicate volatile
    30 const static const int volatile inline f07();                   // duplicate const
    31 volatile static const int inline const volatile f08();  // duplicate volatile
     26const static const inline volatile int f05();                   // duplicate const
     27volatile static const volatile inline int f06();                // duplicate volatile
     28const static const volatile int inline f07();                   // duplicate const
     29volatile static const int inline const volatile f08();          // duplicate volatile
    3230
    33 volatile static const int inline const volatile f09();  // duplicate volatile
    34 _Atomic _Atomic _Atomic volatile restrict static const const int inline restrict const volatile f09();  // duplicate volatile
     31volatile static const int inline const volatile f09();          // duplicate volatile
     32volatile static const int inline const volatile f09();          // duplicate volatile
    3533
    3634//Dummy main
Note: See TracChangeset for help on using the changeset viewer.