Studying note of GCC-3.4.6 source (132)

5.12.5.2.2.2.1.2.    Create the VAR_DECL

Next in cp_parser_simple_declaration , cp_parser_init_declarator is invoked to parse the declarator part. With call-stack of cp_parser_declarator à cp_parser_direct_declarator à cp_parser_declarator_id à cp_parser_id_expression à cp_parser_unqualified_id à cp_parser_identifier , it creates an IDENTIFIER_NODE for “object_”. Then continue in cp_parser_init_declarator following code snippet would be executed.

 

cp_parser_init_declarator (continue)

 

10095   /* Enter the newly declared entry in the symbol table. If we're

10096     processing a declaration in a class-specifier, we wait until

10097     after processing the initializer.  */

10098   if (!member_p)

10099   {

10100     if (parser->in_unbraced_linkage_specification_p)

10101     {

10102       decl_specifiers = tree_cons (error_mark_node,

10103                              get_identifier ("extern"),

10104                              decl_specifiers);

10105       have_extern_spec = false;

10106     }

10107     decl = start_decl (declarator, decl_specifiers,

10108                    is_initialized, attributes, prefix_attributes);

10109   }

 

“SmallObject<> object_” is a variable declaration. A new tree node needs be created to stand for this entity in the intermediate tree. At this invocation, argument intialized is false, attributes and prefix_attributes both are NULL.

 

3670   tree

3671   start_decl (tree declarator,                                                                               in decl.c

3672            tree declspecs,

3673            int initialized,

3674            tree attributes,

3675            tree prefix_attributes)

3676   {

3677     tree decl;

3678     tree type, tem;

3679     tree context;

3680  

3681     /* This should only be done once on the top most decl.  */

3682     if (have_extern_spec )

3683     {

3684       declspecs = tree_cons (NULL_TREE, get_identifier ("extern"),

3685                         declspecs);

3686       have_extern_spec = false;

3687     }

3688  

3689     /* An object declared as __attribute__((deprecated)) suppresses

3690       warnings of uses of other deprecated items.  */

3691     if (lookup_attribute ("deprecated", attributes))

3692       deprecated_state = DEPRECATED_SUPPRESS;

3693  

3694     attributes = chainon (attributes, prefix_attributes);

3695  

3696     decl = grokdeclarator (declarator, declspecs, NORMAL, initialized,

3697                        &attributes);

3698  

3699     deprecated_state = DEPRECATED_NORMAL;

3700  

3701     if (decl == NULL_TREE || TREE_CODE (decl) == VOID_TYPE)

3702       return error_mark_node;

3703  

3704     type = TREE_TYPE (decl);

3705  

3706     if (type == error_mark_node)

3707       return error_mark_node;

3708  

3709     context = DECL_CONTEXT (decl);

3710  

3711     if (initialized && context && TREE_CODE (context) == NAMESPACE_DECL

3712        && context != current_namespace && TREE_CODE (decl) == VAR_DECL)

3713     {

3714       /* When parsing the initializer, lookup should use the object's

3715         namespace.  */

3716       push_decl_namespace (context);

3717     }

3718  

3719     /* We are only interested in class contexts, later.  */

3720     if (context && TREE_CODE (context) == NAMESPACE_DECL)

3721       context = NULL_TREE;

 

Being a kind of declaration, ceratin DECL node is expected, so grokdeclarator analyses the part of decl-specifiers and declaractor to form this node.

 

6462   tree

6463   grokdeclarator (tree declarator,                                                                        in decl.c

6464                tree declspecs,

6465                enum decl_context decl_context,

6466                int initialized,

6467                tree* attrlist)

6468   {

6469     RID_BIT_TYPE specbits;

6470     int nclasses = 0;

6471     tree spec;

6472     tree type = NULL_TREE;

6473     int longlong = 0;

6474     int type_quals;

6475     int virtualp, explicitp, friendp, inlinep, staticp;

6476     int explicit_int = 0;

6477     int explicit_char = 0;

6478     int defaulted_int = 0;

6479     int extern_langp = 0;

6480     tree dependant_name = NULL_TREE;

6481    

6482     tree typedef_decl = NULL_TREE;

6483     const char *name;

6484     tree typedef_type = NULL_TREE;

6485     int funcdef_flag = 0;

6486     enum tree_code innermost_code = ERROR_MARK;

6487     int bitfield = 0;

6488   #if 0

6489     /* See the code below that used this.  */

6490     tree decl_attr = NULL_TREE;

6491   #endif

6492  

6493     /* Keep track of what sort of function is being processed

6494       so that we can warn about default return values, or explicit

6495       return values which do not match prescribed defaults.  */

6496     special_function_kind sfk = sfk_none;

6497  

6498     tree dname = NULL_TREE;

6499     tree ctype = current_class_type;

6500     tree ctor_return_type = NULL_TREE;

6501     enum overload_flags flags = NO_SPECIAL;

6502     tree quals = NULL_TREE;

6503     tree raises = NULL_TREE;

6504     int template_count = 0;

6505     tree in_namespace = NULL_TREE;

6506     tree returned_attrs = NULL_TREE;

6507     tree scope = NULL_TREE;

6508     tree parms = NULL_TREE;

6509  

6510     RIDBIT_RESET_ALL (specbits);

6511     if (decl_context == FUNCDEF)

6512       funcdef_flag = 1, decl_context = NORMAL;

6513     else if (decl_context == MEMFUNCDEF)

6514       funcdef_flag = -1, decl_context = FIELD;

6515     else if (decl_context == BITFIELD)

6516       bitfield = 1, decl_context = FIELD;

6517  

6518     /* Look inside a declarator for the name being declared

6519       and get it as a string, for an error message.  */

6520     {

6521       tree *next = &declarator;

6522       tree decl;

6523       name = NULL;

6524  

6525       while (next && *next)

6526       {

6527          decl = *next;

6528          switch (TREE_CODE (decl))

6529          {

              

6629            case IDENTIFIER_NODE:

6630                if (TREE_CODE (decl) == IDENTIFIER_NODE)

6631                  dname = decl;

6632  

6633                next = 0;

6634  

6635                if (C_IS_RESERVED_WORD (dname))

6636                 {

                    

6640               }

6641              else if (!IDENTIFIER_TYPENAME_P (dname))

6642                  name = IDENTIFIER_POINTER (dname);

               

6654               break ;

6655      

6656           }

6657       }

6658     }

       

6828     /* Look through the decl specs and record which ones appear.

6829       Some typespecs are defined as built-in typenames.

6830       Others, the ones that are modifiers of other types,

6831       are represented by bits in SPECBITS: set the bits for

6832       the modifiers that appear. Storage class keywords are also in SPECBITS.

6833  

6834       If there is a typedef name or a type, store the type in TYPE.

6835       This includes builtin typedefs such as `int'.

6836  

6837       Set EXPLICIT_INT if the type is `int' or `char' and did not

6838       come from a user typedef.

6839  

6840       Set LONGLONG if `long' is mentioned twice.

6841  

6842       For C++, constructors and destructors have their own fast treatment.  */

6843  

6844     for (spec = declspecs; spec; spec = TREE_CHAIN (spec))

6845     {

6846       int i;

6847       tree id;

6848  

6849       /* Certain parse errors slip through. For example,

6850         `int class;' is not caught by the parser. Try

6851         weakly to recover here.  */

6852       if (TREE_CODE (spec) != TREE_LIST)

6853         return 0;

6854  

6855       id = TREE_VALUE (spec);

6856  

6857       /* If the entire declaration is itself tagged as deprecated then

6858         suppress reports of deprecated items.  */

6859       if (!adding_implicit_members && id && TREE_DEPRECATED (id))

6860       {

6861         if (deprecated_state != DEPRECATED_SUPPRESS)

6862           warn_deprecated_use (id);

6863       }

6864  

6865       if (TREE_CODE (id) == IDENTIFIER_NODE)

6866       {

           

6933       }

6934       else if (TREE_CODE (id) == TYPE_DECL)

6935       {

6936         if (type)

6937           error ("multiple declarations `%T' and `%T'", type,

6938                 TREE_TYPE (id));

6939         else

6940         {

6941           type = TREE_TYPE (id);

6942           TREE_VALUE (spec) = type;

6943           typedef_decl = id;

6944         }

6945         goto found;

6946       }

6947       if (type)

6948         error ("two or more data types in declaration of `%s'", name);

6949       else if (TREE_CODE (id) == IDENTIFIER_NODE)

6950       {

           

6960       }

6961       else if (id != error_mark_node)

6962         /* Can't change CLASS nodes into RECORD nodes here!  */

6963         type = id;

6964  

6965   found: ;

6966     }

6967  

6968   #if 0

6969     /* See the code below that used this.  */

6970     if (typedef_decl)

6971       decl_attr = DECL_ATTRIBUTES (typedef_decl);

6972   #endif

6973     typedef_type = type;

       

7019     ctype = NULL_TREE;

       

7337     scope = get_scope_of_declarator (declarator);

7338  

7339     /* Now figure out the structure of the declarator proper.

7340       Descend through it, creating more complex types, until we reach

7341       the declared identifier (or NULL_TREE, in an abstract declarator).  */

7342  

7343     while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE

7344           && TREE_CODE (declarator) != TEMPLATE_ID_EXPR)

7345     {

         

7840     }

       

8163     {

8164       tree decl;

8165  

8166       if (decl_context == PARM)

8167       {

           

8172       }

8173       else if (decl_context == FIELD)

8174       {

           

8427       }

8428       else if (TREE_CODE (type) == FUNCTION_TYPE

8429             || TREE_CODE (type) == METHOD_TYPE)

8430       {

           

8514       }

8515       else

8516       {

8517         /* It's a variable.  */

8518  

8519         /* An uninitialized decl with `extern' is a reference.  */

8520         decl = grokvardecl (type, declarator, &specbits,

8521                         initialized,

8522                         (type_quals & TYPE_QUAL_CONST) != 0,

8523                         ctype ? ctype : in_namespace);

8524         bad_specifiers (decl, "variable", virtualp, quals != NULL_TREE,

8525                      inlinep, friendp, raises != NULL_TREE);

8526  

8527         if (ctype)

8528         {

             

8547         }

8548       }

8549  

8550       my_friendly_assert (!RIDBIT_SETP (RID_MUTABLE, specbits), 19990927);

8551  

8552       /* Record `register' declaration for warnings on &

8553         and in case doing stupid register allocation.  */

8554  

8555       if (RIDBIT_SETP (RID_REGISTER, specbits))

8556         DECL_REGISTER (decl) = 1;

8557  

8558       if (RIDBIT_SETP (RID_EXTERN, specbits))

8559         DECL_THIS_EXTERN (decl) = 1;

8560  

8561       if (RIDBIT_SETP (RID_STATIC, specbits))

8562         DECL_THIS_STATIC (decl) = 1;

8563  

8564       /* Record constancy and volatility. There's no need to do this

8565         when processing a template; we'll do this for the instantiated

8566         declaration based on the type of DECL.  */

8567       if (!processing_template_decl)

8568         c_apply_type_quals_to_decl (type_quals, decl);

8569  

8570       return decl;

8571     }

8572   }

 

In above code, it is very clearly that code of WHILE block at line 6525 verifies the declarator part; and code of FOR block at line 6844 verifies and retrieves the corresponding type-specifier. Note that at line 6941, type refers to the RECORD_TYPE created in last section.

Next type and declarator should be combined to form the VAR_DECL by grokvardecl . Note that for our case, during invocation, argument scope is NULL, constp is false, initialized is false, and specbits_in contains 0.

 

5885   static tree

5886   grokvardecl (tree type,                                                                                    in decl.c

5887              tree name,

5888              RID_BIT_TYPE * specbits_in,

5889              int initialized,

5890              int constp,

5891              tree scope)

5892   {

5893     tree decl;

5894     tree explicit_scope;

5895     RID_BIT_TYPE specbits;

5896  

5897     my_friendly_assert (!name || TREE_CODE (name) == IDENTIFIER_NODE,

5898                      20020808);

5899  

5900     specbits = *specbits_in;

5901  

5902     /* Compute the scope in which to place the variable, but remember

5903       whether or not that scope was explicitly specified by the user.  */

5904     explicit_scope = scope;

5905     if (!scope)

5906     {

5907       /* An explicit "extern" specifier indicates a namespace-scope

5908         variable.  */

5909       if (RIDBIT_SETP (RID_EXTERN, specbits))

5910         scope = current_namespace;

5911       else if (!at_function_scope_p ())

5912       {

5913         scope = current_scope ();

5914          if (!scope)

5915           scope = current_namespace;

5916       }

5917     }

5918  

5919     if (scope

5920        && (/* If the variable is a namespace-scope variable declared in a

5921              template, we need DECL_LANG_SPECIFIC.  */

5922             (TREE_CODE (scope) == NAMESPACE_DECL && processing_template_decl)

5923              /* Similarly for namespace-scope variables with language linkage

5924                other than C++.  */

5925              || (TREE_CODE (scope) == NAMESPACE_DECL

5926                && current_lang_name != lang_name_cplusplus)

5927             /* Similarly for static data members.  */

5928             || TYPE_P (scope)))

5929       decl = build_lang_decl (VAR_DECL, name, type);

5930     else

5931       decl = build_decl (VAR_DECL, name, type);

5932  

5933     if (explicit_scope && TREE_CODE (explicit_scope) == NAMESPACE_DECL)

5934       set_decl_namespace (decl, explicit_scope, 0);

5935     else

5936       DECL_CONTEXT (decl) = scope;

5937  

5938     if (name && scope && current_lang_name != lang_name_c)

5939        /* We can't mangle lazily here because we don't have any

5940         way to recover whether or not a variable was `extern

5941         "C"' later.  */

5942       mangle_decl (decl);

5943  

5944     if (RIDBIT_SETP (RID_EXTERN, specbits))

5945     {

5946       DECL_THIS_EXTERN (decl) = 1;

5947       DECL_EXTERNAL (decl) = !initialized;

5948     }

5949  

5950     /* In class context, static means one per class,

5951       public access, and static storage.  */

5952     if (DECL_CLASS_SCOPE_P (decl))

5953     {

5954       TREE_PUBLIC (decl) = 1;

5955       TREE_STATIC (decl) = 1;

5956       DECL_EXTERNAL (decl) = 0;

5957     }

5958     /* At top level, either `static' or no s.c. makes a definition

5959       (perhaps tentative), and absence of `static' makes it public.  */

5960     else if (toplevel_bindings_p ())

5961     {

5962       TREE_PUBLIC (decl) = (RIDBIT_NOTSETP (RID_STATIC, specbits)

5963                            && (DECL_THIS_EXTERN (decl) || ! constp));

5964       TREE_STATIC (decl) = ! DECL_EXTERNAL (decl);

5965     }

5966     /* Not at top level, only `static' makes a static definition.  */

5967     else

5968     {

5969       TREE_STATIC (decl) = !! RIDBIT_SETP (RID_STATIC, specbits);

5970       TREE_PUBLIC (decl) = DECL_EXTERNAL (decl);

5971     }

5972  

5973     if (RIDBIT_SETP (RID_THREAD, specbits))

5974     {

5975       if (targetm .have_tls)

5976         DECL_THREAD_LOCAL (decl) = 1;

5977       else

5978         /* A mere warning is sure to result in improper semantics

5979           at runtime. Don't bother to allow this to compile.  */

5980         error ("thread-local storage not supported for this target");

5981     }

5982  

5983     if (TREE_PUBLIC (decl))

5984     {

5985       /* [basic.link]: A name with no linkage (notably, the name of a class

5986         or enumeration declared in a local scope) shall not be used to

5987         declare an entity with linkage.

5988  

5989         Only check this for public decls for now.  */

5990       tree t = no_linkage_check (TREE_TYPE (decl));

5991       if (t)

5992       {

5993         if (TYPE_ANONYMOUS_P (t))

5994           /* Ignore for now; `enum { foo } e' is pretty common.  */;

5995         else

5996           pedwarn ("non-local variable `%#D' uses local type `%T'",

5997                    decl, t);

5998       }

5999     }

6000  

6001     return decl;

6002   }

 

After this step, we get following VAR_DECL as below figure. Note that context field of the node is NULL as we are not within class scope.

(Click here for open )

 

start_decl (continue)

 

3832     /* Enter this declaration into the symbol table.  */

3833     tem = maybe_push_decl (decl);

3834  

3835     if (processing_template_decl)

3836       tem = push_template_decl (tem);

3837     if (tem == error_mark_node)

3838       return error_mark_node;

3839  

3840   #if ! defined ( ASM_OUTPUT_BSS) && ! defined (ASM_OUTPUT_ALIGNED_BSS)

3841     /* Tell the back-end to use or not use .common as appropriate. If we say

3842       -fconserve-space, we want this to save .data space, at the expense of

3843       wrong semantics. If we say -fno-conserve-space, we want this to

3844       produce errors about redefs; to do this we force variables into the

3845       data segment.  */

3846     DECL_COMMON (tem) = ((TREE_CODE (tem) != VAR_DECL

3847                              || !DECL_THREAD_LOCAL (tem))

3848                            && (flag_conserve_space || ! TREE_PUBLIC (tem)));

3849   #endif

3850  

3851     if (! processing_template_decl)

3852       start_decl_1 (tem);

3853  

3854     return tem;

3855   }

 

Being a VAR_DECL node containing context field of NULL, maybe_push_decl invokes pushdecl for decl . And for our case, start_decl_1 at line 3852 does nothing.

 

566    tree

567    pushdecl (tree x)                                                                               in name-lookup.c

568    {

569      tree t;

570      tree name;

571      int need_new_binding;

572   

573      timevar_push (TV_NAME_LOOKUP);

574   

575      need_new_binding = 1;

576   

577      if (DECL_TEMPLATE_PARM_P (x))

578        /* Template parameters have no context; they are not X::T even

579          when declared within a class or namespace.  */

580        ;

581      else

582      {

583        if (current_function_decl && x != current_function_decl

584           /* A local declaration for a function doesn't constitute

585             nesting.  */

586           && TREE_CODE (x) != FUNCTION_DECL

587           /* A local declaration for an `extern' variable is in the

588             scope of the current namespace, not the current

589             function.  */

590           && !(TREE_CODE (x) == VAR_DECL && DECL_EXTERNAL (x))

591           && !DECL_CONTEXT (x))

592          DECL_CONTEXT (x) = current_function_decl ;

         

602      }

603   

604      name = DECL_NAME (x);

605      if (name)

606      {

607        int different_binding_level = 0;

         

615        /* In case this decl was explicitly namespace-qualified, look it

616          up in its namespace context.  */

617        if (DECL_NAMESPACE_SCOPE_P (x) && namespace_bindings_p ())

618          t = namespace_binding (name, DECL_CONTEXT (x));

619        else

620          t = lookup_name_current_level (name);

         

828        /* This name is new in its binding level.

829          Install the new declaration and return it.  */

830        if (namespace_bindings_p ())

831        {

           

872        }

873        else

874        {

875          /* Here to install a non-global value.  */

876          tree oldlocal = IDENTIFIER_VALUE (name);

877          tree oldglobal = IDENTIFIER_NAMESPACE_VALUE (name);

878   

879          if (need_new_binding)

880          {

881            push_local_binding (name, x, 0);

882            /* Because push_local_binding will hook X on to the

883              current_binding_level's name list, we don't want to

884              do that again below.  */

885            need_new_binding = 0;

886          }

           

1003       }

1004  

1005       if (TREE_CODE (x) == VAR_DECL)

1006          maybe_register_incomplete_var (x);

1007     }

       

1015     POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x);

1016   }

 

We have seen pushdecl many times; again we just put the executed code of the function in above. Note that maybe_register_incomplete_var at line 1006 does nothing for non-external VAR_DECL. At the exit of start_decl we get following intermediate tree.

( Click here for open )

 

cp_parser_init_declarator (continue)

 

10111   /* Enter the SCOPE. That way unqualified names appearing in the

10112     initializer will be looked up in SCOPE.  */

10113   if (scope)

10114     pop_p = push_scope (scope);

10115

10116   /* Perform deferred access control checks, now that we know in which

10117     SCOPE the declared entity resides.  */

10118   if (!member_p && decl)

10119   {

10120     tree saved_current_function_decl = NULL_TREE;

10121

10122     /* If the entity being declared is a function, pretend that we

10123        are in its scope. If it is a `friend', it may have access to

10124       things that would not otherwise be accessible.  */

10125     if (TREE_CODE (decl) == FUNCTION_DECL)

10126     {

10127       saved_current_function_decl = current_function_decl ;

10128       current_function_decl = decl;

10129     }

10130     

10131     /* Perform the access control checks for the declarator and the

10132       the decl-specifiers.  */

10133     perform_deferred_access_checks ();

10134

10135     /* Restore the saved value.  */

10136     if (TREE_CODE (decl) == FUNCTION_DECL)

10137       current_function_decl = saved_current_function_decl;

10138   }

10139

10140   /* Parse the initializer.  */

10141   if (is_initialized)

10142     initializer = cp_parser_initializer (parser,

10143                                 &is_parenthesized_init,

10144                                 &is_non_constant_init);

10145   else

10146   {

10147     initializer = NULL_TREE;

10148     is_parenthesized_init = false;

10149     is_non_constant_init = true;

10150   }

         

10178   /* Finish processing the declaration. But, skip friend

10179     declarations.  */

10180   if (!friend_p && decl)

10181     cp_finish_decl (decl,

10182                  initializer,

10183                  asm_specification,

10184                     /* If the initializer is in parentheses, then this is

10185                     a direct-initialization, which means that an

10186                      `explicit' constructor is OK. Otherwise, an

10187                     `explicit' constructor cannot be used.  */

10188                  ((is_parenthesized_init || !is_initialized)

10189                  ? 0 : LOOKUP_ONLYCONVERTING));

10190

10191   /* Remember whether or not variables were initialized by

10192     constant-expressions.  */

10193   if (decl && TREE_CODE (decl) == VAR_DECL

10194       && is_initialized && !is_non_constant_init)

10195     DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = true;

10196

10197   return decl;

10198 }

 

Notice that after creating the nodes for template-id and VAR_DECL, it is time to perform the deferred access checking for the related declarator and decl-specifier. See that error in access checking will not stop the parser.

 

你可能感兴趣的:(Studying note of GCC-3.4.6 source (132))