This patch adds support for parsing metadirectives in the C parser. Metadirectives are represented by a OMP_METADIRECTIVE tree node. It has a single operand (accessed by OMP_METADIRECTIVE_CLAUSES) which contains a chain of TREE_LIST nodes, each one representing a clause from the metadirective. TREE_PURPOSE(clause) contains the selector of the clause, while TREE_VALUE(clause) contains another TREE_LIST - the TREE_PURPOSE contains the tree for the directive, while the TREE_VALUE contains the standalone body (if any). If an OMP directive has an associated body, it will be part of the tree at TREE_PURPOSE(TREE_VALUE(clause)) - the standalone body at TREE_VALUE(TREE_VALUE(clause) is only used for standalone directives that do not have an associated body (strictly speaking, it isn't a part of the directive variant at all). At present, all standalone bodies in a metadirective are shared, and will point to the same tree node. Labels in the statement body are handled by first scanning the body for labels, then enclosing the statements in a lexical block with the found labels declared as local using __label__. This prevents labels in the body interfering with each other when the body is re-parsed. I have removed support for the 'omp begin metadirective'..'omp end metadirective' form of the directive that was originally in the WIP patch. According to the spec, the only variant directives that can be used in this form must have an 'end ' form (apart from the 'nothing' directive), and in C/C++, the only directive that we support with an end form is 'declare target', which we currently forbid since it is declarative. Kwok