summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/parse
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/parse')
-rw-r--r--gcc/testsuite/g++.dg/parse/access1.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/access10.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/access2.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/access3.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/access4.C20
-rw-r--r--gcc/testsuite/g++.dg/parse/access5.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/access6.C24
-rw-r--r--gcc/testsuite/g++.dg/parse/access7.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/access8.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/access9.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/ambig1.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/ambig2.C27
-rw-r--r--gcc/testsuite/g++.dg/parse/ambig3.C21
-rw-r--r--gcc/testsuite/g++.dg/parse/ambig4.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/ambig5.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/ambig6.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/angle-bracket.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/angle-bracket2.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/args1.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/array-size1.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/array-size2.C20
-rw-r--r--gcc/testsuite/g++.dg/parse/asm1.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/asm2.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/asm3.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/attr-ctor1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C49
-rw-r--r--gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C38
-rw-r--r--gcc/testsuite/g++.dg/parse/attr1.C50
-rw-r--r--gcc/testsuite/g++.dg/parse/attr2.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/attr3.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/bitfield1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/bitfield2.C34
-rw-r--r--gcc/testsuite/g++.dg/parse/bitfield3.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/break-in-for.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/builtin1.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/builtin2.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/cast1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/cast2.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/casting-operator1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/casting-operator2.C27
-rw-r--r--gcc/testsuite/g++.dg/parse/catch1.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/class1.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/class2.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C31
-rw-r--r--gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/comma1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/comma2.C19
-rw-r--r--gcc/testsuite/g++.dg/parse/concat1.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/cond1.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/cond2.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/cond3.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/cond4.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/cond5.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/condexpr1.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/constant1.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/constant2.C28
-rw-r--r--gcc/testsuite/g++.dg/parse/constant3.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/constant4.C40
-rw-r--r--gcc/testsuite/g++.dg/parse/constant5.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/constant6.C23
-rw-r--r--gcc/testsuite/g++.dg/parse/constant7.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/constructor1.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/constructor2.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/constructor3.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/conv_op1.C30
-rw-r--r--gcc/testsuite/g++.dg/parse/crash1.C1
-rw-r--r--gcc/testsuite/g++.dg/parse/crash10.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/crash11.C34
-rw-r--r--gcc/testsuite/g++.dg/parse/crash12.C24
-rw-r--r--gcc/testsuite/g++.dg/parse/crash13.C22
-rw-r--r--gcc/testsuite/g++.dg/parse/crash14.C20
-rw-r--r--gcc/testsuite/g++.dg/parse/crash15.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/crash16.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/crash17.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/crash18.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/crash19.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/crash2.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/crash20.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/crash21.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/crash22.C25
-rw-r--r--gcc/testsuite/g++.dg/parse/crash23.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/crash24.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/crash25.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/crash26.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/crash27.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/crash28.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/crash29.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/crash3.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/crash30.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/crash31.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/crash32.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/crash33.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/crash34.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/crash35.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/crash36.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/crash37.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/crash38.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/crash39.C3
-rw-r--r--gcc/testsuite/g++.dg/parse/crash4.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/crash40.C42
-rw-r--r--gcc/testsuite/g++.dg/parse/crash41.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/crash42.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/crash43.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/crash44.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/crash45.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/crash46.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/crash47.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/crash48.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/crash49.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/crash5.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/crash50.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/crash51.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/crash52.C3
-rw-r--r--gcc/testsuite/g++.dg/parse/crash53.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/crash54.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/crash55.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/crash56.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/crash57.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/crash6.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/crash7.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/crash9.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor2.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor3.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor4.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor5.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor6.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor7.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor8.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor9.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/dce1.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/decl-specifier-1.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg1.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg10.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg11.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg12.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg13.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg14.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg15.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg2.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg3.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg4.C32
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg5.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg6.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg7.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg8.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg9.C20
-rw-r--r--gcc/testsuite/g++.dg/parse/direct-initialization-2.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/dot1.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor1.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor10.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor11.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor12.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor13.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor14.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor15.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor2.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor3.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor4.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor5.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor6.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor7.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor8.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/dtor9.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/eh-decl.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/elab1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/elab2.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/else-2.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/else.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/enum1.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/enum2.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/enum3.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/enum4.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/enum5.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/error-column.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/error1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/error10.C19
-rw-r--r--gcc/testsuite/g++.dg/parse/error11.C71
-rw-r--r--gcc/testsuite/g++.dg/parse/error12.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/error13.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/error14.C26
-rw-r--r--gcc/testsuite/g++.dg/parse/error15.C41
-rw-r--r--gcc/testsuite/g++.dg/parse/error16.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/error17.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/error18.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/error19.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/error2.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/error20.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/error21.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/error22.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/error23.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/error24.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/error25.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/error26.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/error27.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/error28.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/error29.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/error3.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/error30.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/error31.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/error32.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/error33.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/error34.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/error35.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/error36.C32
-rw-r--r--gcc/testsuite/g++.dg/parse/error37.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/error4.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/error5.C19
-rw-r--r--gcc/testsuite/g++.dg/parse/error6.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/error7.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/error8.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/error9.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/explicit1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/expr1.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/expr2.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/expr3.C32
-rw-r--r--gcc/testsuite/g++.dg/parse/extern-C-1.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/extern1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/fn-typedef1.C19
-rw-r--r--gcc/testsuite/g++.dg/parse/fn-typedef2.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/for1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/friend1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/friend2.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/friend3.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/friend4.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/friend5.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/friend6.C3
-rw-r--r--gcc/testsuite/g++.dg/parse/friend7.C37
-rw-r--r--gcc/testsuite/g++.dg/parse/friend8.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/func-def1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/funptr1.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/fused-params1.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/inline1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/int-as-enum1.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/invalid-op1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/limits-initializer1.C37
-rw-r--r--gcc/testsuite/g++.dg/parse/linkage1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/linkage2.C3
-rw-r--r--gcc/testsuite/g++.dg/parse/linkage3.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/local-class1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/local1.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/long1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/lookup1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/lookup2.C21
-rw-r--r--gcc/testsuite/g++.dg/parse/lookup3.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/lookup4.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/lookup5.C26
-rw-r--r--gcc/testsuite/g++.dg/parse/memfnquals1.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/missing-template1.C23
-rw-r--r--gcc/testsuite/g++.dg/parse/mutable1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/named_ops.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace-definition.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace10.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace11.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace12.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace2.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace3.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace4.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace5.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace6.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace7.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace8.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace9.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/new1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/new2.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/new3.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/new4.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/no-type-defn1.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/no-typename1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/no-value1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/non-dependent1.C19
-rw-r--r--gcc/testsuite/g++.dg/parse/non-dependent2.C37
-rw-r--r--gcc/testsuite/g++.dg/parse/non-dependent3.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/non-templ1.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/nontype1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/octal1.C1
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof2.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof3.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof4.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof5.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof6.C19
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof7.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof8.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof9.C32
-rw-r--r--gcc/testsuite/g++.dg/parse/operator1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/operator2.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/operator3.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/operator4.C1
-rw-r--r--gcc/testsuite/g++.dg/parse/operator5.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/operator6.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/operator7.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/parameter-declaration-1.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/parameter-declaration-2.C1
-rw-r--r--gcc/testsuite/g++.dg/parse/parens1.C18
-rw-r--r--gcc/testsuite/g++.dg/parse/parens2.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/parse1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/parse2.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/parse3.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/parse4.C25
-rw-r--r--gcc/testsuite/g++.dg/parse/parse5.C33
-rw-r--r--gcc/testsuite/g++.dg/parse/parse6.C31
-rw-r--r--gcc/testsuite/g++.dg/parse/parse7.C24
-rw-r--r--gcc/testsuite/g++.dg/parse/parser-pr14875-2.C31
-rw-r--r--gcc/testsuite/g++.dg/parse/parser-pr14875.C20
-rw-r--r--gcc/testsuite/g++.dg/parse/parser-pr28152-2.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/parser-pr28152.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/pr16696-permissive.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/pr16696.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/pr20118.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/pr26997.C50
-rw-r--r--gcc/testsuite/g++.dg/parse/pr37862.C25
-rw-r--r--gcc/testsuite/g++.dg/parse/pr56239.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/pragma1.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/pragma2.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/pragma3.C26
-rw-r--r--gcc/testsuite/g++.dg/parse/primary-expression-1.C58
-rw-r--r--gcc/testsuite/g++.dg/parse/ptrmem1.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/ptrmem2.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/ptrmem3.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/ptrmem4.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/ptrmem5.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/ptrmem6.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/pure1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/qualified1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/qualified2.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/qualified3.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/qualified4.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/redef1.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/redef2.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/ref1.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/register1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/repo1.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/ret-type1.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/ret-type2.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/ret-type3.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/saved1.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/semicolon1.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/semicolon1.h2
-rw-r--r--gcc/testsuite/g++.dg/parse/semicolon2.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/semicolon3.C260
-rw-r--r--gcc/testsuite/g++.dg/parse/semicolon4.C37
-rw-r--r--gcc/testsuite/g++.dg/parse/specialization1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/stack1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/stmtexpr1.C9
-rw-r--r--gcc/testsuite/g++.dg/parse/stmtexpr2.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/stmtexpr3.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/struct-1.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/struct-2.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/struct-3.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/struct-4.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/struct-as-enum1.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/template1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/template10.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/template11.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/template12.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/template13.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/template14.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/template15.C26
-rw-r--r--gcc/testsuite/g++.dg/parse/template16.C15
-rw-r--r--gcc/testsuite/g++.dg/parse/template17.C13
-rw-r--r--gcc/testsuite/g++.dg/parse/template18.C52
-rw-r--r--gcc/testsuite/g++.dg/parse/template19.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/template2.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/template20.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/template21.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/template22.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/template23.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/template24.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/template25.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/template3.C19
-rw-r--r--gcc/testsuite/g++.dg/parse/template4.C21
-rw-r--r--gcc/testsuite/g++.dg/parse/template5.C19
-rw-r--r--gcc/testsuite/g++.dg/parse/template6.C20
-rw-r--r--gcc/testsuite/g++.dg/parse/template7.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/template8.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/template9.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/tmpl-outside1.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C20
-rw-r--r--gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/try-catch-1.C14
-rw-r--r--gcc/testsuite/g++.dg/parse/typedef1.C3
-rw-r--r--gcc/testsuite/g++.dg/parse/typedef2.C3
-rw-r--r--gcc/testsuite/g++.dg/parse/typedef3.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/typedef4.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/typedef5.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/typedef6.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/typedef7.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/typedef8.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/typedef9.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/typename1.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/typename10.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/typename11.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/typename2.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/typename3.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/typename4.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/typename5.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/typename6.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/typename7.C33
-rw-r--r--gcc/testsuite/g++.dg/parse/typename8.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/typename9.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/typespec1.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/undefined1.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/undefined2.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/undefined3.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/undefined4.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/undefined5.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/undefined6.C6
-rw-r--r--gcc/testsuite/g++.dg/parse/undefined7.C5
-rw-r--r--gcc/testsuite/g++.dg/parse/using1.C1
-rw-r--r--gcc/testsuite/g++.dg/parse/using2.C8
-rw-r--r--gcc/testsuite/g++.dg/parse/using3.C22
-rw-r--r--gcc/testsuite/g++.dg/parse/varmod1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/wrong-inline1.C12
418 files changed, 5576 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/parse/access1.C b/gcc/testsuite/g++.dg/parse/access1.C
new file mode 100644
index 000000000..f8994e39e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access1.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Origin: Volker Lukas <vlukas@gmx.de>
+
+// PR c++/9554: Access checking for template ID as class head.
+
+class enclose
+{
+ template<typename T> struct enclosed;
+};
+
+template <>
+struct enclose::enclosed<int>;
diff --git a/gcc/testsuite/g++.dg/parse/access10.C b/gcc/testsuite/g++.dg/parse/access10.C
new file mode 100644
index 000000000..62adc1b16
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access10.C
@@ -0,0 +1,11 @@
+// PR c++/18698
+// The compiler was giving an error message for invalid syntax
+// that irrelevantly talked about using-declarations.
+
+template<int> struct A
+{
+ ::A~(); // { dg-bogus "using-declaration" }
+};
+
+// Instead of the bogus error we get a different error.
+// { dg-error "template-name" "" { target *-*-* } 7 }
diff --git a/gcc/testsuite/g++.dg/parse/access2.C b/gcc/testsuite/g++.dg/parse/access2.C
new file mode 100644
index 000000000..ee8cd234e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access2.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Deferred access checking of variable declaration.
+
+class A {
+ typedef int X; // { dg-error "private" }
+ static X a, b, c;
+};
+
+A::X A::a;
+A::X A::b, x; // { dg-error "this context" }
+A::X y, A::c; // { dg-error "this context" }
+A::X z; // { dg-error "this context" }
diff --git a/gcc/testsuite/g++.dg/parse/access3.C b/gcc/testsuite/g++.dg/parse/access3.C
new file mode 100644
index 000000000..43303c95a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access3.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: <bagnara@cs.unipr.it>
+
+// PR c++/7809: Befriending inaccessible name.
+
+class A {
+private:
+ void f(); // { dg-error "private" }
+};
+
+class B {
+ friend void A::f(); // { dg-error "context" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/access4.C b/gcc/testsuite/g++.dg/parse/access4.C
new file mode 100644
index 000000000..d3870bd34
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access4.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Origin: Mike Reed <mike.reed@amadron.com>
+
+// PR c++/11174: Access checking of pointer-to-member function
+
+class A {
+protected:
+ void foo() {} // { dg-error "protected" }
+public:
+ A();
+};
+
+class B : public A {
+ void bar() {
+ A a;
+ void (A::*pmf)() = &A::foo; // { dg-error "this context" }
+ (a.*pmf)();
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/access5.C b/gcc/testsuite/g++.dg/parse/access5.C
new file mode 100644
index 000000000..cd1789eed
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access5.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/11174: Access checking on pointer to member data.
+
+struct A
+{
+protected:
+ int a; // { dg-error "protected" }
+};
+
+struct B : A
+{
+ void foo() {
+ (void)&A::a; // { dg-error "this context" }
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/access6.C b/gcc/testsuite/g++.dg/parse/access6.C
new file mode 100644
index 000000000..33d509058
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access6.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Origin: David Baron <dbaron@fas.harvard.edu>
+
+// PR c++/3765: Changing access from public to private by member
+// using declaration.
+
+class A
+{
+ public:
+ int foo() { return 1; } // { dg-error "inaccessible" }
+};
+
+class B : public A
+{
+ private:
+ using A::foo;
+};
+
+int main()
+{
+ B b;
+ return b.foo(); // { dg-error "this context" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/access7.C b/gcc/testsuite/g++.dg/parse/access7.C
new file mode 100644
index 000000000..2a7ca3c42
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access7.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Origin: Paolo Carlini <pcarlini@unitus.it>
+
+// PR c++/5655: Access of member redeclaration.
+
+struct S {
+ class A;
+ template <class T> class B;
+private:
+ class A {}; // { dg-error "different access" }
+ template <class T> class B {}; // { dg-error "different access" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/access8.C b/gcc/testsuite/g++.dg/parse/access8.C
new file mode 100644
index 000000000..45f4be702
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access8.C
@@ -0,0 +1,12 @@
+// PR c++/22618
+
+class foo
+{
+ typedef int memfun; // { dg-error "private" }
+};
+
+template<foo::memfun>
+struct fm_obj { }; // { dg-error "context" }
+
+template <typename T = foo::memfun> // { dg-error "context" }
+struct S {};
diff --git a/gcc/testsuite/g++.dg/parse/access9.C b/gcc/testsuite/g++.dg/parse/access9.C
new file mode 100644
index 000000000..2c29016b0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access9.C
@@ -0,0 +1,5 @@
+// PR c++/24782
+
+class Foo { public: typedef int type1; };
+class Bar { private: typedef Foo type2; }; // { dg-error "private" }
+void g(Bar::type2::type1) {} // { dg-error "context" }
diff --git a/gcc/testsuite/g++.dg/parse/ambig1.C b/gcc/testsuite/g++.dg/parse/ambig1.C
new file mode 100644
index 000000000..2645879b3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ambig1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Jan 2003 <nathan@codesourcery.com>
+
+// PR 9109. Ambiguity. [dcl.ambig.res]/7
+
+template <typename T> void Foo (int (T))
+{
+ try {}
+ catch (int (T)) {}
+}
diff --git a/gcc/testsuite/g++.dg/parse/ambig2.C b/gcc/testsuite/g++.dg/parse/ambig2.C
new file mode 100644
index 000000000..7b000c620
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ambig2.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jan 2003 <nathan@codesourcery.com>
+
+// PR 9212. We erroneously accepted an ill-formed
+// function-declaration, rather than a variable initializer.
+
+
+struct A
+{
+ enum E { e };
+ A(E);
+};
+
+struct B
+{
+ enum F { f };
+ B(F);
+};
+
+struct C
+{
+ C(A, B, A);
+};
+
+C c(A(A::e), B(B::f), A(A::e)); // This is not a function declaration
diff --git a/gcc/testsuite/g++.dg/parse/ambig3.C b/gcc/testsuite/g++.dg/parse/ambig3.C
new file mode 100644
index 000000000..41390710f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ambig3.C
@@ -0,0 +1,21 @@
+// PR c++/9452
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <int> struct A { static const int i = 1; };
+template <int> struct B {};
+
+template <typename> int foo(B<0>)
+{
+ return 0;
+}
+
+template <typename, int j> B<A<j>::i-1> foo(B<j>)
+{
+ return B<0>();
+}
+
+int main()
+{
+ return foo<int>(B<0>());
+}
diff --git a/gcc/testsuite/g++.dg/parse/ambig4.C b/gcc/testsuite/g++.dg/parse/ambig4.C
new file mode 100644
index 000000000..868f07cf7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ambig4.C
@@ -0,0 +1,18 @@
+// PR c++/20293
+
+namespace hide { // { dg-error "hide" }
+ int k;
+}
+
+namespace {
+ int i;
+ namespace hide { // { dg-error "hide" }
+ int j;
+ }
+}
+
+void F(int) {}
+
+int main() {
+ F(hide::j); // { dg-error "ambiguous" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/ambig5.C b/gcc/testsuite/g++.dg/parse/ambig5.C
new file mode 100644
index 000000000..e554d961f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ambig5.C
@@ -0,0 +1,7 @@
+// PR c++/41786
+
+struct A { A(int, char const*); };
+int main() {
+ int i = 0, *b = &i;
+ A a(int(b[i]), "hello");
+}
diff --git a/gcc/testsuite/g++.dg/parse/ambig6.C b/gcc/testsuite/g++.dg/parse/ambig6.C
new file mode 100644
index 000000000..8f37feaea
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ambig6.C
@@ -0,0 +1,12 @@
+// PR c++/48046
+
+namespace N1 { typedef int T; } // { dg-error "" }
+namespace N2 { typedef float T; } // { dg-error "" }
+
+int main()
+{
+ using namespace N1;
+ using namespace N2;
+
+ static T t; // { dg-error "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/angle-bracket.C b/gcc/testsuite/g++.dg/parse/angle-bracket.C
new file mode 100644
index 000000000..39bb4eb10
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/angle-bracket.C
@@ -0,0 +1,9 @@
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+// Origin: Bill Somerville <bill@classdesign.com>
+// { dg-do compile }
+
+int main()
+{
+ ( int() > int() );
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/angle-bracket2.C b/gcc/testsuite/g++.dg/parse/angle-bracket2.C
new file mode 100644
index 000000000..fb758e33f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/angle-bracket2.C
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// Contributed by MattyT <mattyt-bugzilla at tpg dot com dot au>
+// PR c++/14028: Parser accepts invalid unbalanced bracket.
+
+template <int> struct A {};
+template <typename TP> class B : public A<4 {}; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/args1.C b/gcc/testsuite/g++.dg/parse/args1.C
new file mode 100644
index 000000000..0eb6e64b6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/args1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 9 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++ 11050. Accepted ill-formed
+
+
+void Foo (int)
+{
+ Foo(2 2); // { dg-error "expected" "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/array-size1.C b/gcc/testsuite/g++.dg/parse/array-size1.C
new file mode 100644
index 000000000..2bc31f758
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/array-size1.C
@@ -0,0 +1,13 @@
+// PR c++/38
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+// { dg-do compile }
+
+template <int i> struct A
+{
+ static const int n = 1;
+ typedef double X[n];
+
+ A (const X&);
+};
+
+template <int i> A<i>::A (const X&) {}
diff --git a/gcc/testsuite/g++.dg/parse/array-size2.C b/gcc/testsuite/g++.dg/parse/array-size2.C
new file mode 100644
index 000000000..355ed6133
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/array-size2.C
@@ -0,0 +1,20 @@
+// PR c/25682
+// { dg-do compile }
+// Test whether we don't ICE on questionable constructs where offsetof
+// should have been used instead.
+
+struct S
+{
+ char a[4];
+ int b;
+};
+
+extern void bar (char *, char *);
+
+void
+foo (void)
+{
+ char g[(char *) &((struct S *) 0)->b - (char *) 0];
+ char h[(__SIZE_TYPE__) &((struct S *) 8)->b];
+ bar (g, h);
+}
diff --git a/gcc/testsuite/g++.dg/parse/asm1.C b/gcc/testsuite/g++.dg/parse/asm1.C
new file mode 100644
index 000000000..009ffbd3a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/asm1.C
@@ -0,0 +1,6 @@
+//PR c++/30849
+
+void foo()
+{
+ asm("" : 0); // { dg-error "numeric constant|token" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/asm2.C b/gcc/testsuite/g++.dg/parse/asm2.C
new file mode 100644
index 000000000..09924c9c7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/asm2.C
@@ -0,0 +1,6 @@
+//PR c++/30850
+
+void foo()
+{
+ asm("" :: 0); // { dg-error "numeric constant|token" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/asm3.C b/gcc/testsuite/g++.dg/parse/asm3.C
new file mode 100644
index 000000000..91f19e48c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/asm3.C
@@ -0,0 +1,6 @@
+//PR c++/30851
+
+void foo()
+{
+ asm ("%[x]" : [0](x)); // { dg-error "numeric constant|token" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/attr-ctor1.C b/gcc/testsuite/g++.dg/parse/attr-ctor1.C
new file mode 100644
index 000000000..23d488a20
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/attr-ctor1.C
@@ -0,0 +1,9 @@
+// PR c++/6992
+// Origin: <petr@scssoft.com>
+// { dg-do compile }
+// { dg-require-named-sections "" }
+
+class A
+{
+ __attribute__((section("whatever"))) A();
+};
diff --git a/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C b/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C
new file mode 100644
index 000000000..845d873aa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C
@@ -0,0 +1,49 @@
+// { dg-do compile }
+// { dg-options "-O3 -fwhole-program" }
+// { dg-add-options bind_pic_locally }
+// { dg-final { scan-assembler "foo1" } }
+// { dg-final { scan-assembler "foo2" } }
+// { dg-final { scan-assembler "foo3" } }
+// { dg-final { scan-assembler "foo4" } }
+// { dg-final { scan-assembler "foo5" } }
+// { dg-final { scan-assembler-not "foo6" } }
+// { dg-final { scan-assembler "bar1" } }
+// { dg-final { scan-assembler "bar2" } }
+// { dg-final { scan-assembler "bar3" } }
+// { dg-final { scan-assembler "bar4" } }
+// { dg-final { scan-assembler "bar5" } }
+// { dg-final { scan-assembler-not "bar6" } }
+
+extern void foo1 (void) __attribute__((externally_visible));
+void foo1 (void) { }
+
+extern void foo2 (void) __attribute__((externally_visible));
+__attribute__((externally_visible)) void foo2 (void) { }
+
+extern void foo3 (void);
+__attribute__((externally_visible)) void foo3 (void) { }
+
+__attribute__((externally_visible)) void foo4 (void) { }
+
+void foo5 (void) { }
+extern void foo5 (void) __attribute__((externally_visible));
+
+void foo6 (void) { }
+
+extern char *bar1 __attribute__((externally_visible));
+char *bar1;
+
+extern char *bar2 __attribute__((externally_visible));
+char *bar2 __attribute__((externally_visible));
+
+extern char *bar3;
+char *bar3 __attribute__((externally_visible));
+
+char *bar4 __attribute__((externally_visible));
+
+char *bar5;
+extern char *bar5 __attribute__((externally_visible));
+
+char *bar6;
+
+int main (void) { }
diff --git a/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C b/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C
new file mode 100644
index 000000000..d7feaabb2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// { dg-options "-O -fwhole-program" }
+
+static void foo1 (void) { } // { dg-warning "have effect only on public" }
+extern void foo1 (void) __attribute__((externally_visible));
+
+struct C
+{
+ __attribute__((externally_visible)) void foo3 (void) { }
+};
+
+__attribute__((externally_visible)) static void foo3 (void) { } // { dg-warning "have effect only on public" }
+
+static int bar1;
+extern int bar1 __attribute__((externally_visible)); // { dg-warning "have effect only on public" }
+
+static int bar2 __attribute__((externally_visible)); // { dg-warning "have effect only on public" }
+
+void fn1 (void)
+{
+ static int bar3 __attribute__((externally_visible)); // { dg-warning "have effect only on public" }
+}
+
+void fn2 (void)
+{
+ int bar4 __attribute__((externally_visible)); // { dg-warning "have effect only on public" }
+}
+
+struct A
+{
+} __attribute__((externally_visible)); // { dg-warning "does not apply to types" }
+
+typedef int B __attribute__((externally_visible)); // { dg-warning "attribute ignored" }
+
+struct D
+{
+ static int d __attribute__((externally_visible));
+};
diff --git a/gcc/testsuite/g++.dg/parse/attr1.C b/gcc/testsuite/g++.dg/parse/attr1.C
new file mode 100644
index 000000000..10d6f57d3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/attr1.C
@@ -0,0 +1,50 @@
+// Test whether attributes are accepted both immediately after
+// struct/union keyword and after the closing brace.
+// { dg-do compile }
+
+struct foo
+{
+ union __attribute__ ((packed))
+ {
+ int a;
+ long b;
+ };
+ union __attribute__ ((packed)) __attribute__ ((unused))
+ {
+ int c;
+ long d;
+ };
+};
+
+union __attribute__ ((packed)) bar
+{
+ int c;
+ long d;
+};
+
+struct __attribute__ ((packed)) baz
+{
+ int e;
+ long f;
+};
+
+struct foo2
+{
+ union
+ {
+ int a;
+ long b;
+ } __attribute__ ((packed));
+};
+
+union bar2
+{
+ int c;
+ long d;
+} __attribute__ ((packed));
+
+struct baz2
+{
+ int e;
+ long f;
+} __attribute__ ((packed));
diff --git a/gcc/testsuite/g++.dg/parse/attr2.C b/gcc/testsuite/g++.dg/parse/attr2.C
new file mode 100644
index 000000000..ce770029c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/attr2.C
@@ -0,0 +1,12 @@
+// PR c++/16337
+
+#define vector __attribute__((vector_size(16)))
+void foo (void)
+{
+ vector signed int v1 = { 1, 2, 3, 4 };
+ vector signed int v2, v3;
+ vector signed int v4;
+ v2 = v1;
+ v3 = v1;
+ v4 = v1;
+}
diff --git a/gcc/testsuite/g++.dg/parse/attr3.C b/gcc/testsuite/g++.dg/parse/attr3.C
new file mode 100644
index 000000000..848df055c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/attr3.C
@@ -0,0 +1,14 @@
+// PR c++/39219
+
+enum __attribute__ ((deprecated)) E { e };
+struct S { enum __attribute__ ((deprecated)) F { f = e }; };
+
+int main () {
+ E x; // { dg-warning "'E' is deprecated" "" }
+ x = e;
+
+ S::F y; // { dg-warning "'F' is deprecated" "" }
+ y = S::f;
+
+ return x + y;
+}
diff --git a/gcc/testsuite/g++.dg/parse/bitfield1.C b/gcc/testsuite/g++.dg/parse/bitfield1.C
new file mode 100644
index 000000000..2e0760585
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/bitfield1.C
@@ -0,0 +1,11 @@
+// PR c++/27803
+
+struct A
+{
+ double i : 8; // { dg-error "type" }
+};
+
+void foo(A& a)
+{
+ (char)a.i; // { dg-error "no member" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/bitfield2.C b/gcc/testsuite/g++.dg/parse/bitfield2.C
new file mode 100644
index 000000000..a04d2adf8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/bitfield2.C
@@ -0,0 +1,34 @@
+//PR c++/28053
+
+struct X {};
+
+struct A
+{
+ X x : 2; // { dg-error "non-integral type" }
+};
+struct B : A {};
+
+template <typename T>
+struct C
+{
+ T t : 3;
+};
+
+C<int> c;
+
+template <typename T>
+struct D
+{
+ T t : 3; // { dg-error "non-integral type" }
+};
+
+D<double> d; // { dg-message "instantiated" }
+
+template <typename T>
+struct E
+{
+ typedef T* U;
+ U t : 3; // { dg-error "non-integral type" }
+};
+
+E<double> e;
diff --git a/gcc/testsuite/g++.dg/parse/bitfield3.C b/gcc/testsuite/g++.dg/parse/bitfield3.C
new file mode 100644
index 000000000..387548a68
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/bitfield3.C
@@ -0,0 +1,9 @@
+/* PR c++/35320 */
+/* { dg-do compile } */
+
+typedef void (func_type)();
+
+struct A
+{
+ friend func_type f : 2; /* { dg-error "with non-integral type" } */
+};
diff --git a/gcc/testsuite/g++.dg/parse/break-in-for.C b/gcc/testsuite/g++.dg/parse/break-in-for.C
new file mode 100644
index 000000000..3028cdc80
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/break-in-for.C
@@ -0,0 +1,12 @@
+/* PR17412 - ICE in fold_const.c during parsing.
+ fold would try to fold the operands of the break statement. */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+
+void foo ()
+{
+ for (;;)
+ for (;;({break;}));
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/builtin1.C b/gcc/testsuite/g++.dg/parse/builtin1.C
new file mode 100644
index 000000000..3b826bd86
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/builtin1.C
@@ -0,0 +1,16 @@
+namespace std {
+class Base {};
+}
+
+struct Derived : public std::Base {
+ operator const char*() const;
+ operator bool(void) const;
+};
+
+void log(const char* str);
+
+void nothing()
+{
+ Derived temp;
+ log(temp);
+}
diff --git a/gcc/testsuite/g++.dg/parse/builtin2.C b/gcc/testsuite/g++.dg/parse/builtin2.C
new file mode 100644
index 000000000..c524ea684
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/builtin2.C
@@ -0,0 +1,5 @@
+// PR c++/14432
+// { dg-options "" }
+
+struct Y {};
+Y y1;
diff --git a/gcc/testsuite/g++.dg/parse/cast1.C b/gcc/testsuite/g++.dg/parse/cast1.C
new file mode 100644
index 000000000..c8dbed1ac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/cast1.C
@@ -0,0 +1,11 @@
+// PR c++/13536
+// { dg-require-effective-target ilp32 } */
+// { dg-options "-w" }
+
+#include <typeinfo>
+
+void f() {
+ (int((char*)0));
+ sizeof ((int((char*)0)));
+ typeid ((int((char*)0)));
+}
diff --git a/gcc/testsuite/g++.dg/parse/cast2.C b/gcc/testsuite/g++.dg/parse/cast2.C
new file mode 100644
index 000000000..d447bb4ba
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/cast2.C
@@ -0,0 +1,13 @@
+// PR c++/13736
+
+struct string
+{
+ string() {}
+ string(const string&) {}
+ string(const char*) {}
+};
+
+int main()
+{
+ string s2(string( (const char*)("")));
+}
diff --git a/gcc/testsuite/g++.dg/parse/casting-operator1.C b/gcc/testsuite/g++.dg/parse/casting-operator1.C
new file mode 100644
index 000000000..867221a35
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/casting-operator1.C
@@ -0,0 +1,11 @@
+// PR c++/8578
+// Origin: <Delana.Lorenzo@libero.it>
+// { dg-do compile }
+
+template <typename T> struct A
+{
+ typedef typename T::X X;
+ operator X();
+};
+
+template <typename T> A<T>::operator typename A<T>::X () {}
diff --git a/gcc/testsuite/g++.dg/parse/casting-operator2.C b/gcc/testsuite/g++.dg/parse/casting-operator2.C
new file mode 100644
index 000000000..008fa62dc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/casting-operator2.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// Contributed by Martin Loewis <loewis at informatik dot hu-berlin dot de>
+// PR c++/8856: Make sure template conversion operators are not parsed as
+// template names.
+
+struct K {};
+template <bool> struct K2 {};
+
+template <class T> struct A {
+ template <class U> operator U() { return U(); }
+};
+
+int main() {
+ A<double> a;
+
+ (void)a.operator int();
+ (void)a.operator double();
+ (void)a.operator K2<true>();
+ (void)a.A<double>::operator int();
+ (void)a.A<double>::operator double();
+ (void)a.A<double>::operator K2<true>();
+
+ (void)a.operator double<int>(); // { dg-error "not a template" }
+ (void)a.operator K<int>(); // { dg-error "not a template" }
+ (void)a.A<double>::operator double<int>(); // { dg-error "not a template" }
+ (void)a.A<double>::operator K<int>(); // { dg-error "not a template" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/catch1.C b/gcc/testsuite/g++.dg/parse/catch1.C
new file mode 100644
index 000000000..877402231
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/catch1.C
@@ -0,0 +1,8 @@
+// PR c++/28249
+// { dg-do compile }
+
+void foo()
+{
+ try {}
+ catch (long long long) {} // { dg-error "long long long" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/class1.C b/gcc/testsuite/g++.dg/parse/class1.C
new file mode 100644
index 000000000..819c48d9c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/class1.C
@@ -0,0 +1,10 @@
+namespace N
+{
+ struct A;
+ int f() {
+ struct N::A { // { dg-error "" }
+ A() {}
+ };
+ return 0;
+ }
+}
diff --git a/gcc/testsuite/g++.dg/parse/class2.C b/gcc/testsuite/g++.dg/parse/class2.C
new file mode 100644
index 000000000..2014f9b50
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/class2.C
@@ -0,0 +1,14 @@
+// PR c++/13140
+
+struct foo {
+ foo();
+ void f();
+ static int i;
+};
+
+
+namespace bar {
+ foo::foo() {} // { dg-error "namespace" }
+ void foo::f() {} // { dg-error "namespace" }
+ int foo::i; // { dg-error "namespace" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C b/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C
new file mode 100644
index 000000000..8e25fbac2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C
@@ -0,0 +1,31 @@
+// PR c++/44522
+// { dg-do compile }
+
+namespace x {
+ struct a { };
+ a A0;
+}
+
+x:a a2; // { dg-error "nested-name-specifier" }
+x::a a3 = a2;
+
+x:a f (void) // { dg-error "nested-name-specifier" }
+{
+ x::a a4; // x:a would parse like a label
+ return a4;
+}
+
+x::a g (x:a a4) // { dg-error "nested-name-specifier" }
+{
+ return a4;
+}
+
+class B
+{
+ x::a f(void) // x:a would parse like a bitfield
+ {
+ x::a a4;
+ a4 = x:A0; // { dg-error "nested-name-specifier" }
+ return a4;
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C b/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C
new file mode 100644
index 000000000..1dfcbc068
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C
@@ -0,0 +1,15 @@
+// PR c++/44523
+// { dg-do compile }
+
+namespace x {
+ struct a { };
+}
+
+template <typename t>
+class foo {
+};
+
+foo<x::a> a1;
+foo<x:a> a2; // { dg-error "nested-name-specifier" }
+
+x::a a3 = a2; // { dg-error "conversion" }
diff --git a/gcc/testsuite/g++.dg/parse/comma1.C b/gcc/testsuite/g++.dg/parse/comma1.C
new file mode 100644
index 000000000..4983535a5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/comma1.C
@@ -0,0 +1,14 @@
+// PR c++/14278
+// { dg-options "" }
+
+struct X {
+ X (int p);
+};
+
+struct A {
+ A(X);
+};
+
+void *p_fun;
+
+A a(X ((*(int (*)(int, int)) p_fun)(0, 0)));
diff --git a/gcc/testsuite/g++.dg/parse/comma2.C b/gcc/testsuite/g++.dg/parse/comma2.C
new file mode 100644
index 000000000..0f405876d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/comma2.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+
+// PR c++/24907 [3.4/4.0/4.1/4.2 Regression] "int x, ;" accepted
+
+int x;
+int y,; /* { dg-error "expected" } */
+
+int main()
+{
+ int a;
+ int b,; /* { dg-error "expected" } */
+ int c,d;
+ int e,f,; /* { dg-error "expected" } */
+ int g,h,i;
+ int j,k,l,;/* { dg-error "expected" } */
+ int m,,,n; /* { dg-error "expected" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/concat1.C b/gcc/testsuite/g++.dg/parse/concat1.C
new file mode 100644
index 000000000..7bf97a628
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/concat1.C
@@ -0,0 +1,15 @@
+/* PR c/3581 */
+/* { dg-do compile } */
+
+/* Intended as a compile-time test for string literal concatenation.
+ The fact that the string isn't actually used in the resulting program
+ should allow this to compile for any target. */
+
+#define e0 "a"
+#define e1 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0
+#define e2 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1
+#define e3 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2
+#define e4 e3 e3 e3 e3 e3 e3 e3 e3 e3 e3
+#define e5 e4 e4 e4 e4 e4 e4 e4 e4 e4 e4
+
+void foo() { (void)(e5); }
diff --git a/gcc/testsuite/g++.dg/parse/cond1.C b/gcc/testsuite/g++.dg/parse/cond1.C
new file mode 100644
index 000000000..699477305
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/cond1.C
@@ -0,0 +1,6 @@
+// PR c++/18389
+
+void foo()
+{
+ for (; struct A {}; ); // { dg-error "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/cond2.C b/gcc/testsuite/g++.dg/parse/cond2.C
new file mode 100644
index 000000000..2dbe42b34
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/cond2.C
@@ -0,0 +1,14 @@
+// PR c++/20905
+
+struct name {};
+
+int
+f ();
+
+void
+g ()
+{
+ if (int name = f ())
+ {
+ }
+}
diff --git a/gcc/testsuite/g++.dg/parse/cond3.C b/gcc/testsuite/g++.dg/parse/cond3.C
new file mode 100644
index 000000000..96d9c1e3b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/cond3.C
@@ -0,0 +1,15 @@
+// PR c++/30847
+// { dg-do compile }
+// { dg-options "" }
+
+int j, k, l;
+extern void baz ();
+
+void
+foo (int i)
+{
+ (i ? j : k) = ({ l++; (void) l; }); // { dg-error "void value not ignored" }
+ (i ? j : k) += ({ l++; (void) l; }); // { dg-error "void value not ignored" }
+ (i ? j : k) = baz (); // { dg-error "void value not ignored" }
+ (i ? j : k) *= baz (); // { dg-error "void value not ignored" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/cond4.C b/gcc/testsuite/g++.dg/parse/cond4.C
new file mode 100644
index 000000000..ae210e0d7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/cond4.C
@@ -0,0 +1,6 @@
+// PR c++/38635
+// { dg-do compile }
+
+void foo()
+{
+ if (struct A{}// { dg-error "types may not be defined|expected" }
diff --git a/gcc/testsuite/g++.dg/parse/cond5.C b/gcc/testsuite/g++.dg/parse/cond5.C
new file mode 100644
index 000000000..7ed9fbe89
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/cond5.C
@@ -0,0 +1,10 @@
+// PR c++/40566
+
+void
+f (int x, int y)
+{
+ int c = x ? 23 : throw "bla";
+ short d = y ? throw "bla" : 23;
+ char e = x ? 23 : throw "bla";
+ long f = x ? 23 : throw "bla";
+}
diff --git a/gcc/testsuite/g++.dg/parse/condexpr1.C b/gcc/testsuite/g++.dg/parse/condexpr1.C
new file mode 100644
index 000000000..1ca7dbfa6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/condexpr1.C
@@ -0,0 +1,13 @@
+// PR c++/10247
+// Origin: Lars Gullik Bjønes <larsbj@lyx.org>
+// { dg-do compile }
+
+struct A {};
+
+A const foo();
+
+void bar()
+{
+ A a = foo();
+ A b = true ? a : foo();
+}
diff --git a/gcc/testsuite/g++.dg/parse/constant1.C b/gcc/testsuite/g++.dg/parse/constant1.C
new file mode 100644
index 000000000..c8a948a57
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constant1.C
@@ -0,0 +1,15 @@
+// { dg-options -std=c++98 }
+
+void f () {
+ switch (0) {
+ case (3, 0): // { dg-error "" }
+ break;
+ }
+}
+
+int g ();
+
+struct S {
+ int i : (false ? g () : 1); // { dg-error "" }
+};
+
diff --git a/gcc/testsuite/g++.dg/parse/constant2.C b/gcc/testsuite/g++.dg/parse/constant2.C
new file mode 100644
index 000000000..43fad2e28
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constant2.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+// Origin: <gawrilow at math dot tu-berlin dot de>
+// PR c++/10750: error when using a static const member initialized
+// with a dependent expression as constant-expression
+
+struct A
+{
+ enum { a = 42 };
+};
+
+template <class Q>
+struct B
+{
+ static const int b = Q::a;
+};
+
+template <typename T, template <typename> class P>
+struct C
+{
+ static const bool a = T::a;
+ static const bool a_ = a;
+ static const bool b = P<T>::b;
+ static const bool b_ = b;
+ static const int c = sizeof(T);
+ static const int c_ = c;
+};
+
+template struct C<A,B>;
diff --git a/gcc/testsuite/g++.dg/parse/constant3.C b/gcc/testsuite/g++.dg/parse/constant3.C
new file mode 100644
index 000000000..c029e33ed
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constant3.C
@@ -0,0 +1,7 @@
+const int i = 1;
+const int j (2);
+const int k = { 3 };
+
+enum { a = i, b = j, c = k };
+
+
diff --git a/gcc/testsuite/g++.dg/parse/constant4.C b/gcc/testsuite/g++.dg/parse/constant4.C
new file mode 100644
index 000000000..a1be5dd02
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constant4.C
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++/11525 incorrect error about non-constant initalizer
+
+template<typename> class X;
+template<unsigned> class Y {};
+
+
+template<typename T>
+void Foo ()
+{
+ static const unsigned I = X<T>::I;
+
+ Y<I> i;
+
+ static const unsigned J = X<T>::J; // { dg-message "not initialized with a constant expression" }
+
+ Y<J> j; // { dg-error "constant|template argument" "" }
+}
+
+struct A
+{
+ operator unsigned () const;
+};
+
+template <typename> struct X
+{
+ enum {I};
+ static A const J;
+};
+
+void Baz ()
+{
+ Foo<int> (); // { dg-message "instantiated" "" }
+}
+
+
diff --git a/gcc/testsuite/g++.dg/parse/constant5.C b/gcc/testsuite/g++.dg/parse/constant5.C
new file mode 100644
index 000000000..f868108a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constant5.C
@@ -0,0 +1,16 @@
+// { dg-options "-std=c++98 -pedantic-errors" }
+
+enum E {
+ a = 24.2, // { dg-error "constant" }
+ b = (int)3.7,
+ c = int(4.2),
+ d = (int)(4.2 + 3.7), // { dg-error "constant" }
+ e = int(4.2 - 3.7), // { dg-error "constant" }
+ f = (int)17.25
+};
+
+struct S {
+ static const int i = (int)4.2;
+ int j[(int)4.2];
+ static const int k = static_cast<short>(3.7);
+};
diff --git a/gcc/testsuite/g++.dg/parse/constant6.C b/gcc/testsuite/g++.dg/parse/constant6.C
new file mode 100644
index 000000000..dae01d47b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constant6.C
@@ -0,0 +1,23 @@
+// PR c++/19883
+
+template<typename T> struct A
+{
+ static const T i = 1;
+ char a[int(i)];
+};
+
+template<int> struct B {};
+
+template<typename T> struct C
+{
+ static const T i = 2;
+ B<int(i)> a;
+};
+
+template< typename T, T N >
+struct integral_c
+{
+ static const T value = N;
+
+ typedef integral_c< T, static_cast<T>((value + 1)) > next;
+};
diff --git a/gcc/testsuite/g++.dg/parse/constant7.C b/gcc/testsuite/g++.dg/parse/constant7.C
new file mode 100644
index 000000000..c54ad55c1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constant7.C
@@ -0,0 +1,9 @@
+// PR c++/19991
+
+enum { e = 1 };
+
+template<typename> struct A
+{
+ static const int i = e;
+ char a[i];
+};
diff --git a/gcc/testsuite/g++.dg/parse/constructor1.C b/gcc/testsuite/g++.dg/parse/constructor1.C
new file mode 100644
index 000000000..1bb9ee0a1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constructor1.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// { dg-options "-fshow-column" }
+
+ACE_Process_Descriptor::ACE_Process_Descriptor () :
+ // { dg-error "does not name a type" "no type" { target *-*-* } 4 }
+ process_ (0)
+{
+}
diff --git a/gcc/testsuite/g++.dg/parse/constructor2.C b/gcc/testsuite/g++.dg/parse/constructor2.C
new file mode 100644
index 000000000..e514e9397
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constructor2.C
@@ -0,0 +1,11 @@
+// PR c++/14260
+
+template <class TClass>
+class T
+{
+public:
+ T(short,short f=0) {}
+ T<TClass>(int f) {}
+ T<TClass>(int f=0,const char* b=0) {}
+};
+
diff --git a/gcc/testsuite/g++.dg/parse/constructor3.C b/gcc/testsuite/g++.dg/parse/constructor3.C
new file mode 100644
index 000000000..fe741c833
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/constructor3.C
@@ -0,0 +1,14 @@
+/* PR c++/29077 */
+/* { dg-do compile } */
+
+class c {
+ c();
+ c(const c&);
+ ~c();
+};
+
+namespace m {
+ c::c() {} /* { dg-error "c::c" } */
+ c::c(const c&) {} /* { dg-error "c::c" } */
+ c::~c() {} /* { dg-error "c::~c" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/conv_op1.C b/gcc/testsuite/g++.dg/parse/conv_op1.C
new file mode 100644
index 000000000..e892f01aa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/conv_op1.C
@@ -0,0 +1,30 @@
+
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 21 Dec 2002 <nathan@codesourcery.com>
+
+// PR 8572. ICE with templated conversion operators.
+
+template <typename T> struct A
+{
+ struct B { };
+ operator B* () const;
+ B *Foo ();
+};
+
+template <typename T> typename A<T>::B *A<T>::Foo ()
+{
+ return 0;
+}
+
+template <typename T> A<T>::operator typename A<T>::B* () const
+{
+ return 0;
+}
+
+void Foo (A<int> &p)
+{
+ p.Foo ();
+ static_cast <A<int>::B *> (p);
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash1.C b/gcc/testsuite/g++.dg/parse/crash1.C
new file mode 100644
index 000000000..750ed18e5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash1.C
@@ -0,0 +1 @@
+struct s { s(std::b o) { } }; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/crash10.C b/gcc/testsuite/g++.dg/parse/crash10.C
new file mode 100644
index 000000000..712e87674
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash10.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++ 10953. ICE
+
+// { dg-bogus "" "" { target *-*-* } 14 }
+
+class
+{
+ typename::
+; // { dg-error "" "" }
diff --git a/gcc/testsuite/g++.dg/parse/crash11.C b/gcc/testsuite/g++.dg/parse/crash11.C
new file mode 100644
index 000000000..eb5cf3c24
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash11.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+// Origin: priesnit@math.uni-goettingen.de
+
+// PR c++/5767: ICE parsing typename with invalid scope.
+
+template <template <typename> class TP>
+struct A
+{
+ template <typename T>
+ struct Template
+ {
+ typedef typename TP<T>::Type Type;
+ };
+};
+template <template <typename> class TP>
+struct B
+{
+ template <typename T>
+ struct Template
+ {
+ typedef typename A<A<TP>::Template> // { dg-error "mismatch|class template" }
+ ::template Template<T>::Type Type; // { dg-error "" }
+ };
+};
+template <typename T>
+struct C
+{
+ typedef void Type;
+};
+int main()
+{
+ typedef B<C>::Template<void>::Type Type; // { dg-error "does not name a type" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash12.C b/gcc/testsuite/g++.dg/parse/crash12.C
new file mode 100644
index 000000000..769ca2e93
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash12.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Origin: Martin von Loewis <martin@v.loewis.de>
+
+// PR c++/157: Incorrect type/template decision in function parameter.
+
+template <class _Tp> class auto_ptr {};
+template <class _Tp>
+class counted_ptr
+{
+public:
+ counted_ptr(::auto_ptr<_Tp>& __a); // { dg-error "candidate" }
+ ::auto_ptr<_Tp> auto_ptr();
+};
+
+template <class _Tp>
+inline counted_ptr<_Tp>::counted_ptr(class auto_ptr& __a) // { dg-error "required|not match|template" }
+{
+}
+
+template <class _Tp>
+inline class auto_ptr<_Tp> counted_ptr<_Tp>::auto_ptr()
+{
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash13.C b/gcc/testsuite/g++.dg/parse/crash13.C
new file mode 100644
index 000000000..3c298ec8e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash13.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/10583: ICE using template function with invalid signature.
+
+template <typename>
+struct A
+{
+ struct B
+ {};
+};
+
+template <typename T>
+void func(A<T>::B* ) // { dg-error "variable|template|expression" }
+{
+}
+
+int main()
+{
+ func<void>(0); // { dg-error "not declared|expression|;" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash14.C b/gcc/testsuite/g++.dg/parse/crash14.C
new file mode 100644
index 000000000..b4cf49a99
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash14.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// Contributed by: Giovanni Bajo <giovannibajo at libero dot it>
+// PR c++/14448: Fold constant initializers in templates
+
+template <int> struct A
+{
+ A();
+};
+
+
+template<typename T> void foo(T)
+{
+ static const int n=1+1;
+ A<n+1> a;
+}
+
+void bar()
+{
+ foo(0);
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash15.C b/gcc/testsuite/g++.dg/parse/crash15.C
new file mode 100644
index 000000000..afad4c1fe
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash15.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Jun 2004 <nathan@codesourcery.com>
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// Bug 16260. ICE
+
+template<typename T> int foo() { return T::X::Y; }
diff --git a/gcc/testsuite/g++.dg/parse/crash16.C b/gcc/testsuite/g++.dg/parse/crash16.C
new file mode 100644
index 000000000..dc8f7a608
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash16.C
@@ -0,0 +1,8 @@
+// PR c++/16971
+
+namespace N {
+ int i; // { dg-error "" }
+ // By checking for an explicit keyword on the next line we avoid
+ // matching an ICE message.
+ int i; // { dg-error "redefinition" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash17.C b/gcc/testsuite/g++.dg/parse/crash17.C
new file mode 100644
index 000000000..e50f07af4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash17.C
@@ -0,0 +1,9 @@
+// PR c++/16716
+
+template <typename> class allocator;
+
+template<typename T> class vector {
+ // With the dg-error on the next line, we are really just trying to
+ // check that the message is not an ICE message.
+ typedef typename allocator<T> allocator_type; // { dg-error "expected|invalid" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/crash18.C b/gcc/testsuite/g++.dg/parse/crash18.C
new file mode 100644
index 000000000..94be360ab
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash18.C
@@ -0,0 +1,7 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com>
+
+// PR 18095: ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A // { dg-error "expected" "" }
diff --git a/gcc/testsuite/g++.dg/parse/crash19.C b/gcc/testsuite/g++.dg/parse/crash19.C
new file mode 100644
index 000000000..cc50d9507
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash19.C
@@ -0,0 +1,7 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com>
+
+// PR 18095: ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {} // { dg-error "expected" "" }
diff --git a/gcc/testsuite/g++.dg/parse/crash2.C b/gcc/testsuite/g++.dg/parse/crash2.C
new file mode 100644
index 000000000..ccf89ccc8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash2.C
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+int main(void)
+{
+ char x, y;
+ if ('A' == x) && ('B' == y)) { } /* { dg-error "" } */
+ if (x == 'A') && (y == 'B')) { } /* { dg-error "" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash20.C b/gcc/testsuite/g++.dg/parse/crash20.C
new file mode 100644
index 000000000..d04869fa7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash20.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18729: ICE on ill formed
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+template<typename T> struct A
+{
+ typedef typename T::X Y; // { dg-error "not a class" "" }
+};
+
+A<int>::Y y; // { dg-message "instantiated from here" "" }
diff --git a/gcc/testsuite/g++.dg/parse/crash21.C b/gcc/testsuite/g++.dg/parse/crash21.C
new file mode 100644
index 000000000..283f6b4d5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash21.C
@@ -0,0 +1,7 @@
+namespace N
+{
+ struct A; // { dg-error "previous declaration" "" }
+}
+
+template<int I>
+struct N::A {}; // { dg-error "redeclared" "" }
diff --git a/gcc/testsuite/g++.dg/parse/crash22.C b/gcc/testsuite/g++.dg/parse/crash22.C
new file mode 100644
index 000000000..eaf4d1a5c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash22.C
@@ -0,0 +1,25 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Jan 2005 <nathan@codesourcery.com>
+
+// PR 19030: ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A; // { dg-error "A" }
+
+namespace N
+{
+ struct A; // { dg-error "A" }
+}
+
+using namespace N;
+
+int A::i; // { dg-error "ambiguous|declared here" "" }
+int A::i; // { dg-error "ambiguous|redefinition of" "" }
+
+namespace N
+{
+ struct C;
+ struct C {};
+}
+
+class D : N::C {};
diff --git a/gcc/testsuite/g++.dg/parse/crash23.C b/gcc/testsuite/g++.dg/parse/crash23.C
new file mode 100644
index 000000000..19ad70a64
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash23.C
@@ -0,0 +1,12 @@
+// PR c++/19733
+
+struct A {};
+typedef int I;
+void foo() {
+ A().~A; // { dg-error "" }
+ A().A::~A; // { dg-error "" }
+ (int().I::~I, 3); // { dg-error "" }
+ int().I::~I; // { dg-error "" }
+}
+
+
diff --git a/gcc/testsuite/g++.dg/parse/crash24.C b/gcc/testsuite/g++.dg/parse/crash24.C
new file mode 100644
index 000000000..fdc4f1e7c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash24.C
@@ -0,0 +1,6 @@
+// PR c++/20461
+// { dg-do compile }
+
+class C; // { dg-error "forward declaration" }
+
+C::C() : f() {} // { dg-error "invalid use|does not have" }
diff --git a/gcc/testsuite/g++.dg/parse/crash25.C b/gcc/testsuite/g++.dg/parse/crash25.C
new file mode 100644
index 000000000..d7f20c62f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash25.C
@@ -0,0 +1,10 @@
+// PR c++/20536
+// Found by Wolfgang Wieser 03/2005.
+// { dg-do compile }
+
+struct yyguts_t
+{
+ class TestScanner* yyextra_r; // { dg-error "forward declaration" }
+};
+
+TestScanner::TestScanner() {} // { dg-error "invalid use" }
diff --git a/gcc/testsuite/g++.dg/parse/crash26.C b/gcc/testsuite/g++.dg/parse/crash26.C
new file mode 100644
index 000000000..2b4f165f8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash26.C
@@ -0,0 +1,12 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Jun 2005 <nathan@codesourcery.com>
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// Bug 21929: ICE on invalid
+
+template<int> struct A
+{
+ struct B;
+};
+
+template<> struct A<void>::B {}; // { dg-error "mismatch|expected|name a type|extra" }
diff --git a/gcc/testsuite/g++.dg/parse/crash27.C b/gcc/testsuite/g++.dg/parse/crash27.C
new file mode 100644
index 000000000..217928781
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash27.C
@@ -0,0 +1,4 @@
+// Bug: 23225
+
+void Dispatcher()
+ (__builtin_offsetof (ArgsType, largeMsgLen)) // { dg-error "initialize|end of input" }
diff --git a/gcc/testsuite/g++.dg/parse/crash28.C b/gcc/testsuite/g++.dg/parse/crash28.C
new file mode 100644
index 000000000..67d78d6bb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash28.C
@@ -0,0 +1,14 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 10 Aug 2005 <nathan@codesourcery.com>
+
+// PR 23219, ICE
+// Origin:Andrew Pinski <pinskia@gcc.gnu.org>
+// Volker Reichelt <reichelt@gcc.gnu.org>
+
+template <class _Tp> class insert_iterator<slist<_Tp> > {}; // { dg-error "not a template|not declared in this scope|expected unqualified-id|extra" }
+template <class _Value> class insert_iterator<int > { // { dg-error "template" }
+ hash_set<_Value>;
+};
+
+template<int> struct A<X<> > {}; // { dg-error "not a template|not declared in this scope|expected unqualified-id|extra" }
+struct A {};
diff --git a/gcc/testsuite/g++.dg/parse/crash29.C b/gcc/testsuite/g++.dg/parse/crash29.C
new file mode 100644
index 000000000..29ede042b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash29.C
@@ -0,0 +1,10 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 23 Aug 2005 <nathan@codesourcery.com>
+
+// PR 22454: ICE
+// Origin: Volker Reichelt reichelt@gcc.gnu.org
+
+template<int> struct A
+{
+ A(void* = &operator new);
+};
diff --git a/gcc/testsuite/g++.dg/parse/crash3.C b/gcc/testsuite/g++.dg/parse/crash3.C
new file mode 100644
index 000000000..5a48ebc7c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash3.C
@@ -0,0 +1,2 @@
+template <class T> struct L { struct I {}; };
+template <class T> void L<T>::I::foo() {} // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/crash30.C b/gcc/testsuite/g++.dg/parse/crash30.C
new file mode 100644
index 000000000..9b68535fa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash30.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+namespace N { template<int> struct A { operator int() const; }; }
+namespace M { template<int> struct A {}; }
+namespace P { typedef int I; }
+
+template<typename> void foo()
+{
+ +typename N::A<0>(); // { dg-bogus "expected" }
+}
+
+template<typename> void bar()
+{
+ +typename M::A<0>; // { dg-error "expected" }
+}
+
+template<typename T> void baz() {
+ typename P::I i; // { dg-bogus "expected" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash31.C b/gcc/testsuite/g++.dg/parse/crash31.C
new file mode 100644
index 000000000..b0a7e1877
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash31.C
@@ -0,0 +1,9 @@
+struct A // { dg-error "forward declaration" }
+{
+ A : A; // { dg-error "expected|incomplete" }
+ A : B; // { dg-error "not declared|incomplete" }
+ A : A(); // { dg-error "undefined type|incomplete" }
+ A : B(); // { dg-error "function call|incomplete|not declared" }
+ A : A[]; // { dg-error "expected|array reference|incomplete" }
+ A : B[]; // { dg-error "not declared|expected|array reference|incomplete" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/crash32.C b/gcc/testsuite/g++.dg/parse/crash32.C
new file mode 100644
index 000000000..df6aa55a4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash32.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+struct Visitor;
+
+struct Ast
+{
+ virtual void accept (Visitor& v);
+};
+
+void
+Ast::accept (Visitor& v)
+{
+ v (*this); // { dg-error "no match for call" "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash33.C b/gcc/testsuite/g++.dg/parse/crash33.C
new file mode 100644
index 000000000..2ab84df46
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash33.C
@@ -0,0 +1,8 @@
+// PR c++/28878
+// { dg-do compile }
+
+template<int>
+void foo()
+[
+ throw; // { dg-error "expected" }
+} // { dg-error "expected" }
diff --git a/gcc/testsuite/g++.dg/parse/crash34.C b/gcc/testsuite/g++.dg/parse/crash34.C
new file mode 100644
index 000000000..181e58417
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash34.C
@@ -0,0 +1,6 @@
+/* PR c++/31745 */
+/* { dg-do compile } */
+
+void foo()
+{
+ namespace N { /* { dg-error "is not allowed|at end of input" } */
diff --git a/gcc/testsuite/g++.dg/parse/crash35.C b/gcc/testsuite/g++.dg/parse/crash35.C
new file mode 100644
index 000000000..4937cdc66
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash35.C
@@ -0,0 +1,7 @@
+/* This used to ICE. */
+/* { dg-do compile } */
+
+struct a {};
+
+class foo : public a, a
+{ /* { dg-error "duplicate base type|at end of input" } */
diff --git a/gcc/testsuite/g++.dg/parse/crash36.C b/gcc/testsuite/g++.dg/parse/crash36.C
new file mode 100644
index 000000000..a5a142c2e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash36.C
@@ -0,0 +1,12 @@
+// PR c++/32567
+// { dg-do compile }
+// { dg-options "-std=c++98" }
+
+template <typename... T> struct A // { dg-warning "variadic templates" }
+{
+ static T &t; // { dg-error "not expanded with" "not expanded" }
+ // { dg-message "T" "T" { target *-*-* } 7 }
+ static const int i = sizeof (++t); // { dg-error "was not declared in this scope" }
+};
+
+int x[A <int>::i]; // { dg-error "constant-expression" }
diff --git a/gcc/testsuite/g++.dg/parse/crash37.C b/gcc/testsuite/g++.dg/parse/crash37.C
new file mode 100644
index 000000000..8320dfaa5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash37.C
@@ -0,0 +1,15 @@
+// PR c++/31941
+// { dg-do compile }
+
+struct S
+{
+ S() throw () { }
+ virtual ~S () throw ();
+ virtual const char* what () const throw ();
+};
+
+const char *
+foo (S &e)
+{
+ return e.what ().c_str (); // { dg-error "c_str.*S::what.*which is of non-class type" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash38.C b/gcc/testsuite/g++.dg/parse/crash38.C
new file mode 100644
index 000000000..724f9b80a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash38.C
@@ -0,0 +1,11 @@
+/* PR c++/33207 */
+
+/* This would not ICE. */
+namespace M { } /* { dg-error "previous declaration" } */
+struct M; /* { dg-error "redeclared as different kind of symbol" } */
+M *p; /* { dg-error "does not name a type" } */
+
+/* This would ICE when processing 'p'. */
+namespace N { } /* { dg-error "previous declaration" } */
+struct N; /* { dg-error "redeclared as different kind of symbol" } */
+struct N* p; /* { dg-error "redeclared as different kind of symbol|invalid type" } */
diff --git a/gcc/testsuite/g++.dg/parse/crash39.C b/gcc/testsuite/g++.dg/parse/crash39.C
new file mode 100644
index 000000000..2f39c10e3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash39.C
@@ -0,0 +1,3 @@
+// PR c++/31747
+
+static extern int i; // { dg-error "conflicting specifiers" }
diff --git a/gcc/testsuite/g++.dg/parse/crash4.C b/gcc/testsuite/g++.dg/parse/crash4.C
new file mode 100644
index 000000000..a24f0dd00
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash4.C
@@ -0,0 +1,12 @@
+struct Bar
+ {
+ typedef int type;
+ };
+
+ struct Foo
+ {
+ void func(void)
+ {
+ mutable Bar::type x; // { dg-error "" }
+ }
+ };
diff --git a/gcc/testsuite/g++.dg/parse/crash40.C b/gcc/testsuite/g++.dg/parse/crash40.C
new file mode 100644
index 000000000..410c2111e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash40.C
@@ -0,0 +1,42 @@
+/* PR c++/34059 */
+/* { dg-do compile } */
+
+struct A
+{
+ template<int> void foo();
+};
+struct B : A {};
+struct C : A {};
+
+class AA
+{
+ template<int> void foo(); /* { dg-error "is private" } */
+};
+struct BB : AA {};
+
+class AAA {
+ int get() const {}
+};
+struct BBB {
+ static BBB *foo();
+private:
+ int get() const {} /* { dg-error "is private" } */
+};
+template<bool> struct S {
+ S(unsigned int = BBB::foo()->AAA::get()); /* { dg-error "is not a base of" } */
+};
+template<bool> struct SS {
+ SS(unsigned int = BBB::foo()->get());
+};
+
+void bar()
+{
+ B().C::foo<0>(); /* { dg-error "is not a member of" } */
+ BB().AA::foo<0>(); /* { dg-error "within this context" } */
+
+ int i;
+ i.C::foo<0>(); /* { dg-error "which is of non-class type" } */
+
+ S<false> s; /* { dg-error "default argument" } */
+ SS<false> ss; /* { dg-error "within this context" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash41.C b/gcc/testsuite/g++.dg/parse/crash41.C
new file mode 100644
index 000000000..746dbbca8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash41.C
@@ -0,0 +1,8 @@
+// PR c++/35327
+
+struct A
+{
+ A(int)(); // { dg-error "declared" }
+};
+
+template<int> void foo(bool b, A a) { b ? a : 0; } // { dg-error "no match" }
diff --git a/gcc/testsuite/g++.dg/parse/crash42.C b/gcc/testsuite/g++.dg/parse/crash42.C
new file mode 100644
index 000000000..9cb07d514
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash42.C
@@ -0,0 +1,9 @@
+// Created by: Dodji Seketeli <dseketel@redhat.com>
+// { dg-do compile }
+// { dg-options "-O2 -fprofile-arcs" }
+// Origin: PR C++/36767
+
+struct A { A (); ~A (); };
+A a[2];
+
+
diff --git a/gcc/testsuite/g++.dg/parse/crash43.C b/gcc/testsuite/g++.dg/parse/crash43.C
new file mode 100644
index 000000000..ff073cf46
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash43.C
@@ -0,0 +1,9 @@
+// PR c++/34600
+
+namespace N
+{
+ void foo()
+ {
+ extern int i = 0; // { dg-error "'i' has both 'extern' and initializer" }
+ }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash44.C b/gcc/testsuite/g++.dg/parse/crash44.C
new file mode 100644
index 000000000..41947b7d1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash44.C
@@ -0,0 +1,15 @@
+// PR c++/37260
+// { dg-options "" }
+
+struct pthread_once_t { };
+struct test {
+ pthread_once_t once;
+};
+
+int main(void) {
+ struct test foo = {
+ once: PTHREAD_ONCE_INITIALIZER // { dg-error "'PTHREAD_ONCE_INITIALIZER' was not declared in this scope" }
+ };
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash45.C b/gcc/testsuite/g++.dg/parse/crash45.C
new file mode 100644
index 000000000..8696ab4bb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash45.C
@@ -0,0 +1,7 @@
+// PR c++/37348
+// { dg-do compile }
+
+struct A
+{
+ template <class> int f (B); // { dg-error "was not declared in this scope|cannot be a member template" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/crash46.C b/gcc/testsuite/g++.dg/parse/crash46.C
new file mode 100644
index 000000000..f454a0a19
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash46.C
@@ -0,0 +1,18 @@
+// PR c++/37532
+// { dg-do compile }
+
+void
+foo (_Decimal32) // { dg-error "declared void" }
+{
+}
+ // { dg-error "was not declared" "" { target *-*-* } 5 }
+void
+bar (_Bool) // { dg-error "declared void" }
+{
+}
+ // { dg-error "was not declared" "" { target *-*-* } 10 }
+void
+baz (_Fract) // { dg-error "declared void" }
+{
+}
+ // { dg-error "was not declared" "" { target *-*-* } 15 }
diff --git a/gcc/testsuite/g++.dg/parse/crash47.C b/gcc/testsuite/g++.dg/parse/crash47.C
new file mode 100644
index 000000000..e77c49fe4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash47.C
@@ -0,0 +1,9 @@
+// PR c++/37531
+// { dg-do compile }
+// { dg-options "-std=gnu++98" }
+
+void
+foo ()
+{
+ (int[i]) { 0 }; // { dg-error "was not declared in this scope" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash48.C b/gcc/testsuite/g++.dg/parse/crash48.C
new file mode 100644
index 000000000..45415484b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash48.C
@@ -0,0 +1,9 @@
+// PR c++/37530
+// { dg-do compile }
+
+void
+foo (bool b)
+{
+ if (b)
+ try { throw 0; } catch (X) { } // { dg-error "expected type-specifier before" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash49.C b/gcc/testsuite/g++.dg/parse/crash49.C
new file mode 100644
index 000000000..07d7c3b2f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash49.C
@@ -0,0 +1,10 @@
+// PR c++/37552
+// { dg-do compile }
+
+extern struct A a[1]; // { dg-error "forward declaration" }
+
+void
+foo ()
+{
+ a[0]; // { dg-error "invalid use of incomplete type" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash5.C b/gcc/testsuite/g++.dg/parse/crash5.C
new file mode 100644
index 000000000..0ac702979
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash5.C
@@ -0,0 +1,15 @@
+// { dg-options "-w" }
+
+class QString { // { dg-error "previous definition" }
+ QString (const QString & a); // { dg-message "QString::QString|candidate expects" }
+};
+
+class QString { }; // { dg-error "redefinition" }
+
+const QString q () {
+ QString z; // { dg-error "matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 10 }
+ int x;
+ return x ? QString () : QString (); // { dg-error "matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 13 }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash50.C b/gcc/testsuite/g++.dg/parse/crash50.C
new file mode 100644
index 000000000..711048de1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash50.C
@@ -0,0 +1,10 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/38636
+// { dg-do compile }
+
+struct A; // { dg-error "forward declaration of 'struct A'" }
+
+A::A(
+
+struct B; // { dg-error "expected '\\)' before ';' token|invalid use of incomplete type 'struct A'" }
+
diff --git a/gcc/testsuite/g++.dg/parse/crash51.C b/gcc/testsuite/g++.dg/parse/crash51.C
new file mode 100644
index 000000000..03fcd3613
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash51.C
@@ -0,0 +1,9 @@
+// PR c++/37554
+
+struct A {};
+class B : A {};
+
+void foo(B b)
+{
+ (A)b; // { dg-error "inaccessible base" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash52.C b/gcc/testsuite/g++.dg/parse/crash52.C
new file mode 100644
index 000000000..bc7f03c8d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash52.C
@@ -0,0 +1,3 @@
+// PR c++/39053
+
+void foo() = // { dg-error "initialized|expected" }
diff --git a/gcc/testsuite/g++.dg/parse/crash53.C b/gcc/testsuite/g++.dg/parse/crash53.C
new file mode 100644
index 000000000..de6d412f1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash53.C
@@ -0,0 +1,13 @@
+// PR c++/35112
+
+namespace X { struct A; } // { dg-error "struct X::A" }
+namespace Y { struct A; } // { dg-error "struct Y::A" }
+namespace Z { struct A; } // { dg-error "struct Z::A" }
+namespace W { struct A; } // { dg-error "struct W::A" }
+
+using namespace X;
+using namespace Y;
+using namespace Z;
+using namespace W;
+
+A* p; // { dg-error "reference to 'A' is ambiguous|'A' does not name a type" }
diff --git a/gcc/testsuite/g++.dg/parse/crash54.C b/gcc/testsuite/g++.dg/parse/crash54.C
new file mode 100644
index 000000000..222082ab7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash54.C
@@ -0,0 +1,15 @@
+// PR c++/42057
+
+struct A; // { dg-error "forward declaration" }
+
+struct B
+{
+ virtual B* foo(A);
+};
+
+struct C : virtual B
+{
+ virtual C* foo(A) { return 0; } // { dg-error "incomplete type" }
+};
+
+C c;
diff --git a/gcc/testsuite/g++.dg/parse/crash55.C b/gcc/testsuite/g++.dg/parse/crash55.C
new file mode 100644
index 000000000..7676d49bc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash55.C
@@ -0,0 +1,8 @@
+// PR c++/42038
+
+extern int __cxa_begin_catch;
+
+void f(void)
+{
+ try { } catch (int) { } // { dg-error "cannot be used" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash56.C b/gcc/testsuite/g++.dg/parse/crash56.C
new file mode 100644
index 000000000..9a370cb5f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash56.C
@@ -0,0 +1,17 @@
+/* PR c++/43081 */
+/* { dg-do compile } */
+/* { dg-options "-std=c++0x" } */
+
+struct A
+{
+ typedef void (F)();
+ F f = []{}; /* { dg-error "invalid initializer" } */
+};
+
+struct B
+{
+ typedef void (F)();
+ F f = 1; /* { dg-error "invalid initializer" } */
+ virtual F f2 = 2; /* { dg-error "invalid initializer" } */
+ F f3 = 3; /* { dg-error "invalid initializer" } */
+};
diff --git a/gcc/testsuite/g++.dg/parse/crash57.C b/gcc/testsuite/g++.dg/parse/crash57.C
new file mode 100644
index 000000000..c6daf777e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash57.C
@@ -0,0 +1,10 @@
+// PR c++/46117
+
+struct A
+{
+ A (typename int); // { dg-error "before|declaration" }
+};
+
+struct B : A {};
+
+B b;
diff --git a/gcc/testsuite/g++.dg/parse/crash6.C b/gcc/testsuite/g++.dg/parse/crash6.C
new file mode 100644
index 000000000..0cc5c84fa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash6.C
@@ -0,0 +1,10 @@
+struct P {};
+
+template <typename >
+struct O
+{
+ struct I;
+};
+
+template <typename T>
+struct O<T>::I::S : P {}; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/crash7.C b/gcc/testsuite/g++.dg/parse/crash7.C
new file mode 100644
index 000000000..86fa47726
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash7.C
@@ -0,0 +1,10 @@
+struct A
+{
+ int foo () const { return 0; }
+};
+
+template <typename> void bar (int x[], const A &a)
+{
+ const int i=a.foo();
+ x[i]=0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/crash9.C b/gcc/testsuite/g++.dg/parse/crash9.C
new file mode 100644
index 000000000..d121d5dd1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash9.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/10793: ICE in handling base class when the current class
+// contains error.
+
+template <typename> struct A {};
+template <typename> struct A<INVALID> : A<int> { }; // { dg-error "not declared|invalid|token|extra" }
diff --git a/gcc/testsuite/g++.dg/parse/ctor1.C b/gcc/testsuite/g++.dg/parse/ctor1.C
new file mode 100644
index 000000000..38428842c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor1.C
@@ -0,0 +1,9 @@
+class L {
+public:
+ L(int);
+};
+
+class R {
+ friend L::L(int);
+};
+
diff --git a/gcc/testsuite/g++.dg/parse/ctor2.C b/gcc/testsuite/g++.dg/parse/ctor2.C
new file mode 100644
index 000000000..604fb2ffd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor2.C
@@ -0,0 +1,4 @@
+// PR c++/19244
+
+typedef struct { void f(); } f;
+void f::f() { }
diff --git a/gcc/testsuite/g++.dg/parse/ctor3.C b/gcc/testsuite/g++.dg/parse/ctor3.C
new file mode 100644
index 000000000..e597d926f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor3.C
@@ -0,0 +1,8 @@
+// PR c++/25633
+
+struct A {};
+
+struct B : A
+{
+ B() : A {} // { dg-error "initializer|expected" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/ctor4.C b/gcc/testsuite/g++.dg/parse/ctor4.C
new file mode 100644
index 000000000..a3e4868e0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor4.C
@@ -0,0 +1,7 @@
+// PR c++/27279
+// { dg-do compile }
+
+struct A
+{
+ A(void,void); // { dg-error "incomplete type|invalid use" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/ctor5.C b/gcc/testsuite/g++.dg/parse/ctor5.C
new file mode 100644
index 000000000..3ea23549c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor5.C
@@ -0,0 +1,14 @@
+// PR c++/27309
+
+struct A
+{
+ int i; // { dg-error "conflicts" }
+ A() i() {} // { dg-error "declaration" }
+};
+
+struct B
+{
+ A a;
+};
+
+B b;
diff --git a/gcc/testsuite/g++.dg/parse/ctor6.C b/gcc/testsuite/g++.dg/parse/ctor6.C
new file mode 100644
index 000000000..0b14ecc6e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor6.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// There is no ambiguity in finding a right constructor for X b(a).
+
+class X {
+public:
+ X(const X&, int = 3);
+};
+
+extern X a;
+X b(a);
diff --git a/gcc/testsuite/g++.dg/parse/ctor7.C b/gcc/testsuite/g++.dg/parse/ctor7.C
new file mode 100644
index 000000000..9fa051b79
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor7.C
@@ -0,0 +1,15 @@
+//PR c++/28505
+
+struct A
+{
+ A : (); // { dg-error "primary-expression|incomplete type" }
+ A : (int); // { dg-error "primary-expression|incomplete type|'int'" }
+};
+
+struct B
+{
+ char c;
+ A a;
+};
+
+B b = (B){0}; // { dg-error "compound-literals" }
diff --git a/gcc/testsuite/g++.dg/parse/ctor8.C b/gcc/testsuite/g++.dg/parse/ctor8.C
new file mode 100644
index 000000000..e43ce4023
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor8.C
@@ -0,0 +1,9 @@
+//PR c++/28505
+
+struct A
+{
+ A : (); // { dg-error "primary-expression|incomplete type" }
+ A : (int); // { dg-error "primary-expression|incomplete type|'int'" }
+};
+
+A a = (A){0}; // { dg-error "too many initializers|compound-literals" }
diff --git a/gcc/testsuite/g++.dg/parse/ctor9.C b/gcc/testsuite/g++.dg/parse/ctor9.C
new file mode 100644
index 000000000..8b2cbf7a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor9.C
@@ -0,0 +1,7 @@
+/* PR c++/37647 */
+/* { dg-do compile } */
+
+struct A
+{
+ A() { void A(); } /* { dg-error "return type specification for constructor invalid|non-class scope" } */
+};
diff --git a/gcc/testsuite/g++.dg/parse/dce1.C b/gcc/testsuite/g++.dg/parse/dce1.C
new file mode 100644
index 000000000..f4de52257
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dce1.C
@@ -0,0 +1,13 @@
+/* Make sure that dead code isn't eliminated too early, avoiding
+ detection of errors. */
+/* { dg-do compile } */
+
+void foo(void)
+{
+ if (0)
+ break; /* { dg-error "" } */
+ if (1)
+ ;
+ else
+ continue; /* { dg-error "" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/decl-specifier-1.C b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C
new file mode 100644
index 000000000..baf0fe778
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C
@@ -0,0 +1,17 @@
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// Origin: PRs 7721 and 7803
+// { dg-do compile }
+
+namespace N
+{
+ template<typename>
+ struct X { }; // { dg-message "N::X" }
+}
+
+N::X X; // { dg-error "" "" }
+
+int main()
+{
+ return sizeof(X); // { dg-error "" "" }
+ // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 15 }
+}
diff --git a/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C b/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C
new file mode 100644
index 000000000..6c3659f75
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C
@@ -0,0 +1,9 @@
+// PR c++/8895
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <typename X, typename Y = B<X> > struct A // { dg-error "" }
+{
+ A();
+ A(const A&);
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg1.C b/gcc/testsuite/g++.dg/parse/defarg1.C
new file mode 100644
index 000000000..77c50e8c3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg1.C
@@ -0,0 +1,5 @@
+class A
+{
+public:
+ A(int nBits = ((int)0x8) | ((int)0x4) | ((int)0x2));
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg10.C b/gcc/testsuite/g++.dg/parse/defarg10.C
new file mode 100644
index 000000000..bbf9ac04b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg10.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 7 Jun 2005 <nathan@codesourcery.com>
+
+// From java library.
+
+void Foo (int = 0);
+
+class Klasse
+{
+ friend void Foo (int);
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg11.C b/gcc/testsuite/g++.dg/parse/defarg11.C
new file mode 100644
index 000000000..60199c2e2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg11.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-pedantic" }
+
+class foo {
+public:
+ void operator& (int = 1); // { dg-error "default argument" }
+ void operator++ (int = 2); // { dg-warning "default argument" }
+ void operator-- (int = 3); // { dg-warning "default argument" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg12.C b/gcc/testsuite/g++.dg/parse/defarg12.C
new file mode 100644
index 000000000..2d2d7e7a0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg12.C
@@ -0,0 +1,13 @@
+/* PR28266 This used to ICE in gimple_add_tmp_var */
+/* { dg-do compile } */
+
+struct A
+{
+ int i;
+ A(int = X); /* { dg-error "was not declared in this scope" }*/
+};
+
+void foo()
+{
+ A().i; /* { dg-error "default argument" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/defarg13.C b/gcc/testsuite/g++.dg/parse/defarg13.C
new file mode 100644
index 000000000..27c6db50a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg13.C
@@ -0,0 +1,8 @@
+// PR c++/38485
+
+template <class Key, class T>
+class QMap { };
+
+class XMLConfigurations {
+ void translateToOther(QMap<int, int> match = (QMap<int, int>()));
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg14.C b/gcc/testsuite/g++.dg/parse/defarg14.C
new file mode 100644
index 000000000..0930b45ee
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg14.C
@@ -0,0 +1,6 @@
+// PR c++/28274
+
+extern "C" {
+void foo (int i, int j = 6);
+void foo (int i = 4, int j);
+}
diff --git a/gcc/testsuite/g++.dg/parse/defarg15.C b/gcc/testsuite/g++.dg/parse/defarg15.C
new file mode 100644
index 000000000..b93af4c92
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg15.C
@@ -0,0 +1,5 @@
+// PR c++/44991
+
+class bar {
+ void foo(bool a = 3 < 2, bool b = true) {}
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg2.C b/gcc/testsuite/g++.dg/parse/defarg2.C
new file mode 100644
index 000000000..571855a3c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg2.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Jan 2003 <nathan@codesourcery.com>
+
+// We erroneously prohibited default args on parenthesized function
+// declarations.
+
+void (foo)(int i = 0);
diff --git a/gcc/testsuite/g++.dg/parse/defarg3.C b/gcc/testsuite/g++.dg/parse/defarg3.C
new file mode 100644
index 000000000..5c81c69e6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg3.C
@@ -0,0 +1,5 @@
+struct A {
+ enum { value = 10 };
+ A() { f(); }
+ static int f(int i=value);
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg4.C b/gcc/testsuite/g++.dg/parse/defarg4.C
new file mode 100644
index 000000000..bafdadb94
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg4.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 3 Jul 2003 <nathan@codesourcery.com>
+
+// PR c++ 9162. default args got left unprocessed
+
+struct S {
+ friend int foo (const S&, int = 100);
+};
+S s;
+int i = foo (s);
+
+struct R
+{
+ template <typename T> R (T, int = 0);
+};
+
+int Foo ()
+{
+ R s (1);
+}
+
+template <typename T> struct Q
+{
+ int Foo (T, int = 0);
+};
+
+int Foo (Q<int> *s)
+{
+ s->Foo (1);
+}
diff --git a/gcc/testsuite/g++.dg/parse/defarg5.C b/gcc/testsuite/g++.dg/parse/defarg5.C
new file mode 100644
index 000000000..01a67ed59
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg5.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 5 Sep 2003 <nathan@codesourcery.com>
+// Origin:Wolfgang Bangerth bangerth@dealii.org
+
+// PR c++/12167 - infinite recursion
+
+class A {
+ void report(int d
+ // the default arg is what NAN etc can expand to, but
+ // with the floatiness removed.
+ = (__extension__ ((union { unsigned l; int d; })
+ { l: 0x7fc00000U }).d));
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg6.C b/gcc/testsuite/g++.dg/parse/defarg6.C
new file mode 100644
index 000000000..827b605b7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg6.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Origin: Falk Hueffner <falk@debian.org>
+
+// PR c++/13166: ICE default function argument for friend declaration.
+
+namespace sc_dt {
+ class sc_length_param {
+ friend int compare_unsigned(int if_v_signed = 0) {}
+ };
+}
diff --git a/gcc/testsuite/g++.dg/parse/defarg7.C b/gcc/testsuite/g++.dg/parse/defarg7.C
new file mode 100644
index 000000000..c1f75ce8f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg7.C
@@ -0,0 +1,5 @@
+// PR c++/14361
+
+class A {
+ A ( int n=0 int n ); // { dg-error "" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg8.C b/gcc/testsuite/g++.dg/parse/defarg8.C
new file mode 100644
index 000000000..1f1f078aa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg8.C
@@ -0,0 +1,10 @@
+struct A {
+ static void g(int);
+};
+
+struct S {
+ static int i;
+
+ friend void f(int = i);
+ friend void A::g(int = i);
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg9.C b/gcc/testsuite/g++.dg/parse/defarg9.C
new file mode 100644
index 000000000..8496cfb26
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg9.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jun 2005 <nathan@codesourcery.com>
+
+// PR 21903:Reject legal with default arg confusion
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+
+struct O {
+ template<typename T> struct B {
+ void set (T, bool=true);
+ };
+
+ struct D : public B<int> {};
+};
+
+void x ()
+{
+ O::D d;
+ d.set(1);
+}
diff --git a/gcc/testsuite/g++.dg/parse/direct-initialization-2.C b/gcc/testsuite/g++.dg/parse/direct-initialization-2.C
new file mode 100644
index 000000000..f362c74a7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/direct-initialization-2.C
@@ -0,0 +1,18 @@
+// Copyright (C) 2002 Free Software Foundation
+// Origin: C++/729
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// { dg-do compile }
+
+struct A {
+ A(int) { }
+};
+
+struct B {
+ typedef B T;
+ B(A, char**) {}
+};
+
+int main(int argc, char** argv)
+{
+ B::T t(A(argc), argv);
+}
diff --git a/gcc/testsuite/g++.dg/parse/dot1.C b/gcc/testsuite/g++.dg/parse/dot1.C
new file mode 100644
index 000000000..3b027d7c1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dot1.C
@@ -0,0 +1,4 @@
+// PR c++/24560
+
+struct A { void f(); };
+void g() { A().f.a; } // { dg-error "class" }
diff --git a/gcc/testsuite/g++.dg/parse/dtor1.C b/gcc/testsuite/g++.dg/parse/dtor1.C
new file mode 100644
index 000000000..08d070ea5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor1.C
@@ -0,0 +1,6 @@
+struct A { typedef int I; };
+int main(void)
+{
+ int * p;
+ p->A::I::~I();
+}
diff --git a/gcc/testsuite/g++.dg/parse/dtor10.C b/gcc/testsuite/g++.dg/parse/dtor10.C
new file mode 100644
index 000000000..a6e905422
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor10.C
@@ -0,0 +1,9 @@
+// PR c++/27508
+// { dg-do compile }
+
+namespace N
+{
+ struct A { ~A(); };
+}
+
+N::~A () {} // { dg-error "not a class-name" }
diff --git a/gcc/testsuite/g++.dg/parse/dtor11.C b/gcc/testsuite/g++.dg/parse/dtor11.C
new file mode 100644
index 000000000..63ffb60ba
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor11.C
@@ -0,0 +1,12 @@
+// PR c++/28606
+// { dg-do compile }
+
+struct A
+{
+ ~A A(); // { dg-error "destructor" }
+};
+
+struct B
+{
+ A::~B B(); // { dg-error "as member of" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/dtor12.C b/gcc/testsuite/g++.dg/parse/dtor12.C
new file mode 100644
index 000000000..1acdfa36b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor12.C
@@ -0,0 +1,6 @@
+// PR c++/29408
+
+template <class T> class a
+{
+ ~a<T>();
+};
diff --git a/gcc/testsuite/g++.dg/parse/dtor13.C b/gcc/testsuite/g++.dg/parse/dtor13.C
new file mode 100644
index 000000000..96c0d227b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor13.C
@@ -0,0 +1,8 @@
+/* PR c++/34963 This used to ICE */
+/* { dg-do compile } */
+
+struct A
+{
+ static friend A::~A(); /* { dg-error "storage class specifiers|extra qualification|implicitly friend" } */
+};
+
diff --git a/gcc/testsuite/g++.dg/parse/dtor14.C b/gcc/testsuite/g++.dg/parse/dtor14.C
new file mode 100644
index 000000000..6ba7a5b6c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor14.C
@@ -0,0 +1,8 @@
+// PR c++/39054
+
+struct A {};
+
+template<typename> void foo()
+{
+ A().~int(); // { dg-error "expected" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/dtor15.C b/gcc/testsuite/g++.dg/parse/dtor15.C
new file mode 100644
index 000000000..ae85a702a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor15.C
@@ -0,0 +1,16 @@
+// PR c++/39225
+
+template <class T>
+class A
+{
+public:
+ A() {}
+ ~B() {} // { dg-error "~B" }
+};
+
+int main()
+{
+ A<int> *a = new A<int>;
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/dtor2.C b/gcc/testsuite/g++.dg/parse/dtor2.C
new file mode 100644
index 000000000..60e132b4a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor2.C
@@ -0,0 +1,4 @@
+struct A {
+ typedef A A2;
+ ~A2(); // { dg-error "" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/dtor3.C b/gcc/testsuite/g++.dg/parse/dtor3.C
new file mode 100644
index 000000000..3041ae4a5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor3.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// Contributed by Wolfgang Bangerth <bangerth at dealii dot org>
+// PR c++/12335: Make sure we don't ICE on the qualified-id form of a
+// destructor call.
+
+struct Y {
+ ~Y() {} // { dg-bogus "note" "implemented DR272" { xfail *-*-* } }
+};
+
+struct X : Y {
+ ~X() {} // { dg-bogus "note" "implemented DR272" { xfail *-*-* } }
+ void f() {
+ X::~X(); // { dg-bogus "" "implemented DR272" { xfail *-*-* } }
+ Y::~Y(); // { dg-bogus "" "implemented DR272" { xfail *-*-* } }
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/dtor4.C b/gcc/testsuite/g++.dg/parse/dtor4.C
new file mode 100644
index 000000000..729ee2fa1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor4.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// Contributed by Paul Koning <pkoning at equallogic dot com>
+// PR c++/15947: Accept destructor as template in qualified-id
+
+template <int N> struct X {
+ ~X();
+};
+
+template <int N>
+X<N>::~X<N>(){}
diff --git a/gcc/testsuite/g++.dg/parse/dtor5.C b/gcc/testsuite/g++.dg/parse/dtor5.C
new file mode 100644
index 000000000..297a0e737
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor5.C
@@ -0,0 +1,12 @@
+// PR c++/19732
+
+struct A;
+typedef int ~A; // { dg-error "non-function" }
+struct B {
+ ~A(); // { dg-error "" }
+ typedef int ~A; // { dg-error "non-function" }
+ void f() {
+ extern ~B(); // { dg-error "non-member" }
+ }
+};
+void ~A(); // { dg-error "non-member" }
diff --git a/gcc/testsuite/g++.dg/parse/dtor6.C b/gcc/testsuite/g++.dg/parse/dtor6.C
new file mode 100644
index 000000000..3333161c3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor6.C
@@ -0,0 +1,8 @@
+// PR c++/25638
+
+struct A { ~A(); }; // { dg-error "candidate" }
+
+struct B : A
+{
+ template<int> friend A::~A(); // { dg-error "match" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/dtor7.C b/gcc/testsuite/g++.dg/parse/dtor7.C
new file mode 100644
index 000000000..a80951266
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor7.C
@@ -0,0 +1,4 @@
+// PR c++/25856
+
+struct A; // { dg-error "forward" }
+A::~A() {} // { dg-error "incomplete" }
diff --git a/gcc/testsuite/g++.dg/parse/dtor8.C b/gcc/testsuite/g++.dg/parse/dtor8.C
new file mode 100644
index 000000000..2fe0a974b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor8.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+struct A {};
+
+struct B
+{
+ friend A::~B(); // { dg-error "as member of" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/dtor9.C b/gcc/testsuite/g++.dg/parse/dtor9.C
new file mode 100644
index 000000000..64c82ce67
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dtor9.C
@@ -0,0 +1,5 @@
+// PR c++/27508
+// { dg-do compile }
+
+struct A;
+using ::~A; // { dg-error "not a class-name" }
diff --git a/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C b/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C
new file mode 100644
index 000000000..a7beabc90
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C
@@ -0,0 +1,13 @@
+// PR c++/8928
+// Origin: <sebor@roguewave.com>
+// { dg-do compile }
+
+namespace N
+{
+
+template <typename T, typename U> struct A {};
+typedef A<int, int> B;
+
+}
+
+N::B<int, int> a; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/eh-decl.C b/gcc/testsuite/g++.dg/parse/eh-decl.C
new file mode 100644
index 000000000..1c72fd39f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/eh-decl.C
@@ -0,0 +1,8 @@
+// PR c++/41876
+
+struct A;
+
+void foo()
+{
+ try {} catch(int A) {}
+}
diff --git a/gcc/testsuite/g++.dg/parse/elab1.C b/gcc/testsuite/g++.dg/parse/elab1.C
new file mode 100644
index 000000000..92fcd1ca6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/elab1.C
@@ -0,0 +1,9 @@
+namespace Name {
+
+ typedef void *(*Function)( void *, int ); // { dg-error "previous declaration" }
+
+ struct Foo {
+ struct Function xyz[5]; // { dg-error "" }
+ };
+
+}
diff --git a/gcc/testsuite/g++.dg/parse/elab2.C b/gcc/testsuite/g++.dg/parse/elab2.C
new file mode 100644
index 000000000..6b42aed67
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/elab2.C
@@ -0,0 +1,7 @@
+struct A {};
+
+struct B
+{
+ typedef A T; // { dg-error "previous declaration" }
+ friend struct T; // { dg-error "" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/else-2.C b/gcc/testsuite/g++.dg/parse/else-2.C
new file mode 100644
index 000000000..7f0b23cd7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/else-2.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options " " }
+
+int f()
+{
+
+ else // { dg-error "'else' without a previous 'if'" }
+ {
+ return 0;
+ }
+}
diff --git a/gcc/testsuite/g++.dg/parse/else.C b/gcc/testsuite/g++.dg/parse/else.C
new file mode 100644
index 000000000..87ea982a8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/else.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options " " }
+
+int f()
+{
+ if (1)
+ {
+ return 1;
+ else // { dg-error "expected .\}. before 'else'" }
+ {
+ return 0;
+ }
+}
diff --git a/gcc/testsuite/g++.dg/parse/enum1.C b/gcc/testsuite/g++.dg/parse/enum1.C
new file mode 100644
index 000000000..d5c5f8688
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/enum1.C
@@ -0,0 +1,4 @@
+// PR c++/15862
+
+enum yn { Y, N };
+enum yn x = Y;
diff --git a/gcc/testsuite/g++.dg/parse/enum2.C b/gcc/testsuite/g++.dg/parse/enum2.C
new file mode 100644
index 000000000..f77f91701
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/enum2.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/18123: ICE pushing tag from invalid template.
+
+template<int> enum E { e }; // { dg-error "declaration|expected" }
diff --git a/gcc/testsuite/g++.dg/parse/enum3.C b/gcc/testsuite/g++.dg/parse/enum3.C
new file mode 100644
index 000000000..dc07193d3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/enum3.C
@@ -0,0 +1,5 @@
+// PR c++/28261
+
+struct A {}; // { dg-error "A::A" }
+
+A::A (enum { e }) {} // { dg-error "defined|prototype" }
diff --git a/gcc/testsuite/g++.dg/parse/enum4.C b/gcc/testsuite/g++.dg/parse/enum4.C
new file mode 100644
index 000000000..6a20ea9cb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/enum4.C
@@ -0,0 +1,10 @@
+// PR c++/37389
+// { dg-do compile }
+// { dg-options "-std=gnu++98" }
+
+enum
+{
+ A = 9223372036854775807ULL * 2 + 1,
+ B = B0, // { dg-error "was not declared|overflow" }
+ C = C0 // { dg-error "was not declared" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/enum5.C b/gcc/testsuite/g++.dg/parse/enum5.C
new file mode 100644
index 000000000..3ebb02f75
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/enum5.C
@@ -0,0 +1,17 @@
+// PR c++/41127
+
+#define CHAR_BIT 8
+enum EE {ee};
+typedef unsigned int T;
+
+struct D {
+ T : sizeof(unsigned int) * CHAR_BIT; // OK
+ EE : sizeof(EE) * CHAR_BIT; // OK
+ enum EE : sizeof(EE) * CHAR_BIT; // not OK
+ enum EE xxxx : sizeof(EE) * CHAR_BIT; // OK
+ T x : sizeof(unsigned int) * CHAR_BIT; // OK
+ enum FF {ff} : sizeof(int) * CHAR_BIT; // OK
+} element;
+
+enum EE xx;
+EE yy;
diff --git a/gcc/testsuite/g++.dg/parse/error-column.C b/gcc/testsuite/g++.dg/parse/error-column.C
new file mode 100644
index 000000000..18dc4633a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error-column.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// Make sure column information is correctly shown in error reporting
+// { dg-options "-fshow-column" }
+
+
+void foo ()
+{
+ cout << "blah"; // { dg-error "3:'cout'" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/error1.C b/gcc/testsuite/g++.dg/parse/error1.C
new file mode 100644
index 000000000..1f8bb3773
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error1.C
@@ -0,0 +1,7 @@
+// { dg-options "-fshow-column" }
+struct INCOMPLETE;
+template <int> struct X {
+ static INCOMPLETE value;
+};
+template <> INCOMPLETE X<1>::value = 0; // { dg-error "30:variable 'INCOMPLETE X<1>::value' has initializer but incomplete type" }
+
diff --git a/gcc/testsuite/g++.dg/parse/error10.C b/gcc/testsuite/g++.dg/parse/error10.C
new file mode 100644
index 000000000..8301172ad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error10.C
@@ -0,0 +1,19 @@
+// PR c++/3478
+// { dg-options "-fshow-column" }
+
+template <typename> struct A
+{
+ enum E {};
+};
+
+template <typename T> void foo()
+{
+ enum A<void>::E e1;
+ typename A<T>::E e2;
+ enum A<T>::E e3;
+ enum typename A<T>::E e4;
+}
+
+// Here, columns nums are not very accurate either. Still acceptable though
+// { dg-error "30:invalid type in declaration before ';' token" "" { target *-*-* } 14 }
+// { dg-error "30:two or more data types in declaration of 'e4'" "" { target *-*-* } 14 }
diff --git a/gcc/testsuite/g++.dg/parse/error11.C b/gcc/testsuite/g++.dg/parse/error11.C
new file mode 100644
index 000000000..39039a880
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error11.C
@@ -0,0 +1,71 @@
+// { dg-do compile }
+// { dg-options "-fshow-column" }"
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// Try to find out when the digraph '<:' is used as a mistake, and parse it
+// correctly to avoid cascaded errors.
+
+struct B;
+
+template <class A>
+struct Foo
+{
+ template <class T>
+ struct Nested
+ {
+ static void method(void) {}
+ };
+
+ void method(void) {
+ typename Foo<::B>::template Nested<::B> n; // { dg-error "17:'<::' cannot begin" "17-begin" }
+// { dg-message "17:'<:' is an alternate spelling" "17-alt" { target *-*-* } 19 }
+// { dg-error "39:'<::' cannot begin" "39-begin" { target *-*-* } 19 }
+// { dg-message "39:'<:' is an alternate spelling" "39-alt" { target *-*-* } 19 }
+ n.template Nested<B>::method();
+ n.template Nested<::B>::method(); // { dg-error "22:'<::' cannot begin" "error" }
+// { dg-message "22:'<:' is an alternate" "note" { target *-*-* } 24 }
+ Nested<B>::method();
+ Nested<::B>::method(); // { dg-error "11:'<::' cannot begin" "error" }
+// { dg-message "11:'<:' is an alternate" "note" { target *-*-* } 27 }
+ }
+};
+
+template <int N> struct Foo2 {};
+template struct Foo2<::B>; // { dg-error "21:'<::' cannot begin" "begin" }
+// { dg-message "21:'<:' is an alternate" "alt" { target *-*-* } 33 }
+// { dg-message "25:type/value mismatch" "mismatch" { target *-*-* } 33 }
+// { dg-error "25:expected a constant" "const" { target *-*-* } 33 }
+
+int value = 0;
+
+void func(void)
+{
+ Foo<::B> f; // { dg-error "cannot begin" "begin" }
+// { dg-message "alternate spelling" "alt" { target *-*-* } 42 }
+ f.Foo<B>::method();
+ f.Foo<::B>::method(); // { dg-error "8:cannot begin" "begin" }
+// { dg-message "8:alternate spelling" "alt" { target *-*-* } 45 }
+
+ // Check cases where we the token sequence is the correct one, but there
+ // was no digraph or whitespaces in the middle, so we should not emit
+ // the special error message.
+ Foo<: :B> k2; // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" }
+ Foo[:B> k1; // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" }
+// { dg-error "6:missing template arguments before" "template" { target *-*-* } { 51 } }
+// { dg-error "9:expected primary-expression before ':' token" "primary" { target *-*-* } 51 }
+// { dg-error "9:expected '\]' before ':' token" "backslash" { target *-*-* } 51 }
+// { dg-error "9:expected ';' before ':' token" "semicolon" { target *-*-* } 51 }
+// { dg-error "6:missing template arguments before" "template" { target *-*-* } 52 }
+// { dg-error "7:expected primary-expression before ':' token" "primary" { target *-*-* } 52 }
+// { dg-error "7:expected '\]' before ':' token" "backslash" { target *-*-* } 52 }
+// { dg-error "7:expected ';' before ':' token" "semicolon" { target *-*-* } 52 }
+//
+ int Foo[2];
+ Foo[::value] = 0;
+}
+
+template struct Foo<::B>; // { dg-error "20:'<::' cannot begin" "begin" }
+// { dg-message "20:is an alternate" "alt" { target *-*-* } 66 }
+
+// On the first error message, an additional note about the use of
+// -fpermissive should be present
+// { dg-message "17:\\(if you use '-fpermissive' G\\+\\+ will accept your code\\)" "-fpermissive" { target *-*-* } 19 }
diff --git a/gcc/testsuite/g++.dg/parse/error12.C b/gcc/testsuite/g++.dg/parse/error12.C
new file mode 100644
index 000000000..3ebcf3894
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error12.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// Make sure the error about '<:' can be turned into a warning
+// { dg-options "-fpermissive -fshow-column" }
+
+struct B;
+
+template <class A>
+struct Foo {};
+
+Foo<::B> foo; // { dg-bogus "error" "error in place of warning" }
+// { dg-warning "4: '<::' cannot begin a template-argument list" "warning <::" { target *-*-* } 11 }
+// { dg-message "4:'<:' is an alternate spelling for '.'. Insert whitespace between '<' and '::'" "note <:" { target *-*-* } 11 }
diff --git a/gcc/testsuite/g++.dg/parse/error13.C b/gcc/testsuite/g++.dg/parse/error13.C
new file mode 100644
index 000000000..9bce98d7f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error13.C
@@ -0,0 +1,14 @@
+// { dg-options "-fshow-column" }
+// PR c++/13975
+
+public: // { dg-error "1:expected unqualified-id before 'public'" }
+
+int i;
+
+protected: // { dg-error "1:expected unqualified-id before 'protected'" }
+
+int j;
+
+private: // { dg-error "1:expected unqualified-id before 'private'" }
+
+int k;
diff --git a/gcc/testsuite/g++.dg/parse/error14.C b/gcc/testsuite/g++.dg/parse/error14.C
new file mode 100644
index 000000000..04f2f56b6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error14.C
@@ -0,0 +1,26 @@
+// { dg-options "-fshow-column" }
+// PR c++/13970
+
+struct X
+{
+ template< typename Z > Z Zunc()
+ {
+ return Z();
+ }
+
+ template< typename Z > void Zinc()
+ {
+ }
+
+ void tst()
+ {
+ Zunc<int>();
+
+ Zinc<int>( //);
+ // }
+
+}; // { dg-error "2:expected '.' at end of input" "at end of input" }
+ // { dg-error "1:expected primary-expression before '.' token" "primary" { target *-*-* } 22 }
+ // { dg-error "1:expected unqualified-id" "unqualified-id" { target *-*-* } 22 }
+ // { dg-error "1:expected ';' before '.' token" "function" { target *-*-* } 22 }
+
diff --git a/gcc/testsuite/g++.dg/parse/error15.C b/gcc/testsuite/g++.dg/parse/error15.C
new file mode 100644
index 000000000..607a1dbb8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error15.C
@@ -0,0 +1,41 @@
+// { dg-do compile }
+// Contributed by Volker Reichelt <reichelt at gcc dot gnu dot org>
+// { dg-options "-fshow-column" }
+// PR c++/14008: Improve diagnostic on invalid types in declarators.
+
+namespace N
+{
+ template<int> struct A {};
+ struct C {};
+ int K;
+}
+
+N::A f2; // { dg-error "1:invalid use of template-name 'N::A' without an argument list" }
+N::INVALID f3; // { dg-error "1:'INVALID' in namespace 'N' does not name a type" }
+N::C::INVALID f4; // { dg-error "1:'INVALID' in 'struct N::C' does not name a type" }
+N::K f6; // { dg-error "1:'K' in namespace 'N' does not name a type" }
+typename N::A f7;
+// { dg-error "13:invalid use of template-name 'N::A' without an argument list" "13" { target *-*-* } 17 }
+// { dg-error "17:invalid type in declaration before ';' token" "17" { target *-*-* } 17 }
+
+struct B
+{
+ N::A f2; // { dg-error "3:invalid use of template-name 'N::A' without an argument list" }
+ N::INVALID f3; // { dg-error "3:'INVALID' in namespace 'N' does not name a type" }
+ N::C::INVALID f4; // { dg-error "3:'INVALID' in 'struct N::C' does not name a type" }
+ N::K f6; // { dg-error "3:'K' in namespace 'N' does not name a type" }
+ typename N::A f7;
+// { dg-error "15:invalid use of template-name 'N::A' without an argument list" "15" { target *-*-* } 27 }
+};
+
+template <int>
+struct C
+{
+ N::A f2; // { dg-error "3:invalid use of template-name 'N::A' without an argument list" }
+ N::INVALID f3; // { dg-error "3:'INVALID' in namespace 'N' does not name a type" }
+ N::C::INVALID f4; // { dg-error "3:'INVALID' in 'struct N::C' does not name a type" }
+ N::K f6; // { dg-error "3:'K' in namespace 'N' does not name a type" }
+ typename N::A f7; // { dg-error "15:invalid use of template-name 'N::A' without an argument list" }
+};
+
+// { dg-bogus "bogus excess errors in declaration" "bogus excess errors in declaration" { target *-*-* } 17 }
diff --git a/gcc/testsuite/g++.dg/parse/error16.C b/gcc/testsuite/g++.dg/parse/error16.C
new file mode 100644
index 000000000..3d9dcc334
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error16.C
@@ -0,0 +1,9 @@
+// { dg-options "-fshow-column" }
+// PR c++/16964
+
+struct A
+{
+ struct B {}; // { dg-error "10:previous definition of 'struct A::B'" }
+};
+
+struct A::B{}; // { dg-error "11:redefinition of 'struct A::B'" }
diff --git a/gcc/testsuite/g++.dg/parse/error17.C b/gcc/testsuite/g++.dg/parse/error17.C
new file mode 100644
index 000000000..b308c912f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error17.C
@@ -0,0 +1,9 @@
+// { dg-options "-fshow-column" }
+// PR c++/16965
+
+template <typename T> struct B {
+ static int Bar(T); // { dg-error "14:candidates are: |with T = int" }
+};
+struct D : B<int>, B<char> {};
+
+int i2 = D::Bar(2); // { dg-error "10:reference to 'Bar' is ambiguous" }
diff --git a/gcc/testsuite/g++.dg/parse/error18.C b/gcc/testsuite/g++.dg/parse/error18.C
new file mode 100644
index 000000000..b5e722221
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error18.C
@@ -0,0 +1,8 @@
+// { dg-options "-fshow-column" }
+// PR c++/16002
+
+void f()
+{
+ double Q *= 5.0; // { dg-error "12:expected initializer before '..' token" }
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/error19.C b/gcc/testsuite/g++.dg/parse/error19.C
new file mode 100644
index 000000000..010a4032e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error19.C
@@ -0,0 +1,15 @@
+// { dg-options "-fshow-column -fmessage-length=0 -ansi -pedantic-errors -Wno-long-long " }
+// PR C++/17867
+
+struct A // { dg-message "8:operator=|no known conversion for implicit" }
+{
+ A(int);
+};
+
+const A& foo();
+
+void bar()
+{
+ foo()=A(0); // { dg-error "12:no match for 'operator='" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 13 }
+}
diff --git a/gcc/testsuite/g++.dg/parse/error2.C b/gcc/testsuite/g++.dg/parse/error2.C
new file mode 100644
index 000000000..7b08df454
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error2.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-fshow-column -std=c++98" }
+// Properly print CALL_EXPRs while dumping expressions
+
+double g;
+int func(double);
+
+template <int>
+struct Foo {};
+
+Foo<func(g)> f; // { dg-error "5:'int func.double.' cannot appear in a constant-expression" "" { target *-*-* } 11 }
+// { dg-error "10:'g' cannot appear in a constant-expression" "" { target *-*-* } 11 }
+// { dg-error "11:a function call cannot appear in a constant-expression" "" { target *-*-* } 11 }
+// { dg-error "12:template argument 1 is invalid" "" { target *-*-* } 11 }
+// { dg-error "15:invalid type in declaration before ';' token" "" { target *-*-* } 11 }
diff --git a/gcc/testsuite/g++.dg/parse/error20.C b/gcc/testsuite/g++.dg/parse/error20.C
new file mode 100644
index 000000000..d2f9353a7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error20.C
@@ -0,0 +1,18 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/17821
+
+struct A {
+ A(int i) {}
+};
+struct B {
+ int i;
+};
+struct C {
+ B* p;
+};
+int main() {
+ C c;
+ A(c.p.i); // { dg-error "9:request for member 'i' in 'c.C::p', which is of non-class type 'B" }
+ return 0;
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/error21.C b/gcc/testsuite/g++.dg/parse/error21.C
new file mode 100644
index 000000000..469e5fb4e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error21.C
@@ -0,0 +1,13 @@
+// PR c++/17393
+// { dg-options "-Wall -fshow-column" }
+
+struct A { };
+
+void foo()
+{
+ // Check that we do not complain about an unused
+ // compiler-generated variable.
+ A& = a; // { dg-error "6:expected unqualified-id before '=' token" "6" }
+ // { dg-error "8:'a' was not declared in this scope" "8" { target *-*-* } 10 }
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/error22.C b/gcc/testsuite/g++.dg/parse/error22.C
new file mode 100644
index 000000000..29552c67a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error22.C
@@ -0,0 +1,6 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/15786
+
+struct A {
+ void foo(bar* p); /* { dg-error "12:'bar' has not been declared" } */
+};
diff --git a/gcc/testsuite/g++.dg/parse/error23.C b/gcc/testsuite/g++.dg/parse/error23.C
new file mode 100644
index 000000000..9c19b562c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error23.C
@@ -0,0 +1,9 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/19149
+
+struct QChar {
+ QChar( char c );
+ QChar( const QChar& c );
+ //following column number is not accurate enough but will make it for now
+ static const ; // { dg-error "10:declaration does not declare anything" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/error24.C b/gcc/testsuite/g++.dg/parse/error24.C
new file mode 100644
index 000000000..c8ab6d992
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error24.C
@@ -0,0 +1,8 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/19395
+
+struct A {
+ typedef int ::X; // { dg-error "17:typedef name may not be a nested-name-specifier" }
+};
+
+
diff --git a/gcc/testsuite/g++.dg/parse/error25.C b/gcc/testsuite/g++.dg/parse/error25.C
new file mode 100644
index 000000000..a0fd24c3a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error25.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// Origin: Steven Bosscher <steven at gcc dot gnu dot org>
+// PR c++/17401: ICE with invalid pure specifier
+
+// NOTE: This also tests QoI of diagnostic for invalid pure specifiers.
+// Please do *not* relax the dg-error tests.
+
+class foo
+{
+ virtual void bar1 () = 0;
+ virtual void bar2 () = __null; // { dg-error "32:invalid pure specifier" }
+ virtual void bar3 () = 4; // { dg-error "27:invalid pure specifier" }
+ virtual void bar4 () = A::f; // { dg-error "27:invalid pure specifier" }
+ virtual void bar5 () = 0l; // { dg-error "28:invalid pure specifier" }
+ virtual void bar6 () = 00; // { dg-error "28:invalid pure specifier" }
+ virtual void bar7 () = 0x0; // { dg-error "29:invalid pure specifier" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/error26.C b/gcc/testsuite/g++.dg/parse/error26.C
new file mode 100644
index 000000000..befaf3bb3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error26.C
@@ -0,0 +1,14 @@
+// PR c++/20148
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+
+void foo()
+{
+ if (({int c[2];})) ; // { dg-error "7:ISO C.. forbids" "7" }
+ // { dg-error "20:could not convert" "20" { target *-*-* } 6 }
+}
+
+void bar()
+{
+ if (({})); // { dg-error "7:ISO C.. forbids" "7" }
+ // { dg-error "11:could not convert" "11" { target *-*-* } 12 }
+}
diff --git a/gcc/testsuite/g++.dg/parse/error27.C b/gcc/testsuite/g++.dg/parse/error27.C
new file mode 100644
index 000000000..90cb231c0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error27.C
@@ -0,0 +1,8 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/20152
+
+struct KrSelectionMode { virtual void init() = 0; }; // { dg-error "8:previous definition of 'struct KrSelectionMode'" }
+struct KrKDESelectionMode : public KrSelectionMode { void init() { } }; // { dg-error "8:previous definition of 'struct KrKDESelectionMode'" }
+struct KrSelectionMode { virtual void init() = 0; }; // { dg-error "8:redefinition of 'struct KrSelectionMode'" }
+struct KrKDESelectionMode : public KrSelectionMode { void init() { } }; // { dg-error "8:redefinition of 'struct KrKDESelectionMode'" }
+KrKDESelectionMode krKDESelectionMode;
diff --git a/gcc/testsuite/g++.dg/parse/error28.C b/gcc/testsuite/g++.dg/parse/error28.C
new file mode 100644
index 000000000..3ca210aa6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error28.C
@@ -0,0 +1,12 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/21908
+
+struct virt { virt () {} virt (int i) {} };
+struct der : public virtual virt { // { dg-message "8:der::der|candidate expects" }
+ der (int i) : virt(i) {} // { dg-message "3:der::der|candidate expects" }
+};
+struct top : public der {
+ top () {} // { dg-bogus "der\\(const" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 9 }
+};
+// { dg-error "10:no matching function for call to 'der" "" { target *-*-* } 9 }
diff --git a/gcc/testsuite/g++.dg/parse/error29.C b/gcc/testsuite/g++.dg/parse/error29.C
new file mode 100644
index 000000000..2c3a3a7f2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error29.C
@@ -0,0 +1,13 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/25637
+
+struct A {
+ void foo();
+ A();
+ void operator delete(void *);
+};
+struct B {
+ friend void A::foo() {} // { dg-error "22:cannot define member function 'A::foo' within 'B'" }
+ friend void A::operator delete(void*) {} // { dg-error "39:cannot define member function 'A::operator delete' within 'B'" }
+ friend A::A() {} // { dg-error "15:cannot define member function 'A::A' within 'B'" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/error3.C b/gcc/testsuite/g++.dg/parse/error3.C
new file mode 100644
index 000000000..7e8cf8de0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error3.C
@@ -0,0 +1,9 @@
+// { dg-options "-fshow-column" }
+// PR c++/10779
+
+static void InstantiateConstraint(const float&, unsigned,
+ void(*AddFunction)(const TYPE&,bool&,
+ char*, char*,
+ unsigned*));
+// { dg-error "64: ISO C\\+\\+ forbids declaration of 'parameter' with no type" "" { target *-*-* } { 5 } }
+// { dg-error "60: 'TYPE' does not name a type" "" { target *-*-* } { 5 } }
diff --git a/gcc/testsuite/g++.dg/parse/error30.C b/gcc/testsuite/g++.dg/parse/error30.C
new file mode 100644
index 000000000..26c55c49c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error30.C
@@ -0,0 +1,12 @@
+// PR c++/30854
+// { dg-do compile }
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+
+struct A
+{
+ A();
+ A(int);
+};
+
+A a = -A(); // { dg-error "10:no match for.*operator-.*in.*-A\\(\\)" }
+A b = -A(5); // { dg-error "11:no match for.*operator-.*in.*-A\\(5\\)" }
diff --git a/gcc/testsuite/g++.dg/parse/error31.C b/gcc/testsuite/g++.dg/parse/error31.C
new file mode 100644
index 000000000..e39285227
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error31.C
@@ -0,0 +1,14 @@
+// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" }
+// PR c++/32190
+
+template<typename T> class foo{ };
+
+int main() {
+ foo<int> i;
+ // this column number is not accurate yet, but that will make it for now.
+ foo<foo<int> j; // { dg-error "18:template argument 1 is invalid" }
+ int k;
+ int l;
+ foo<int> m;
+ return 0;
+ }
diff --git a/gcc/testsuite/g++.dg/parse/error32.C b/gcc/testsuite/g++.dg/parse/error32.C
new file mode 100644
index 000000000..da27afdda
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error32.C
@@ -0,0 +1,12 @@
+/* PR c++/37555 */
+/* { dg-do compile } */
+
+struct A {};
+
+typedef void (A::T)(); /* { dg-error "typedef name may not be a nested-name-specifier" } */
+
+void foo()
+{
+ T t;
+ t; /* { dg-error "was not declared" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/error33.C b/gcc/testsuite/g++.dg/parse/error33.C
new file mode 100644
index 000000000..e3a7166ed
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error33.C
@@ -0,0 +1,16 @@
+/* PR c++/37556 */
+/* { dg-do compile } */
+
+struct A
+{
+ void foo();
+};
+
+typedef void (A::T)(); /* { dg-error "typedef name may not be a nested" } */
+
+void bar(T); /* { dg-message "note: declared here" } */
+
+void baz()
+{
+ bar(&A::foo); /* { dg-error "too many arguments" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/error34.C b/gcc/testsuite/g++.dg/parse/error34.C
new file mode 100644
index 000000000..449ea689a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error34.C
@@ -0,0 +1,8 @@
+// PR c++/33465
+
+int foo(int);
+
+void bar(double d)
+{
+ foo(d)(); // { dg-error "foo\\(\\(int\\)d\\)" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/error35.C b/gcc/testsuite/g++.dg/parse/error35.C
new file mode 100644
index 000000000..59e726a31
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error35.C
@@ -0,0 +1,8 @@
+// PR c++/33465
+
+int foo(double);
+
+void bar(int i)
+{
+ foo(i)(); // { dg-error "foo\\(\\(double\\)i\\)" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/error36.C b/gcc/testsuite/g++.dg/parse/error36.C
new file mode 100644
index 000000000..8fcaa2fb2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error36.C
@@ -0,0 +1,32 @@
+// PR c++/15946
+// Test for helpful error message about missing typename.
+
+template <class T> struct A
+{
+ struct B { };
+ static B b;
+};
+
+template <class T>
+void f(T t)
+{
+ typedef A<T>::foo type; // { dg-error "typename" }
+ A<T>::bar b; // { dg-error "typename" }
+} // { dg-error "expected ';'" "" { target *-*-* } 14 }
+
+// PR c++/36353
+template <class T> struct B
+{
+ void f()
+ {
+ A<T>::baz z; // { dg-error "typename" }
+ } // { dg-error "expected ';'" "" { target *-*-* } 22 }
+};
+
+// PR c++/40738
+template <class T>
+void g(const A<T>::type &t); // { dg-error "typename" }
+// { dg-error "no type" "" { target *-*-* } 28 }
+
+// PR c++/18451
+template <class T> A<T>::B A<T>::b; // { dg-error "typename" }
diff --git a/gcc/testsuite/g++.dg/parse/error37.C b/gcc/testsuite/g++.dg/parse/error37.C
new file mode 100644
index 000000000..309912647
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error37.C
@@ -0,0 +1,5 @@
+/* PR c++/42054 */
+/* { dg-do compile } */
+
+template<int int> struct A; /* { dg-error "two or more" } */
+template<int int> struct A; /* { dg-error "two or more" } */
diff --git a/gcc/testsuite/g++.dg/parse/error4.C b/gcc/testsuite/g++.dg/parse/error4.C
new file mode 100644
index 000000000..792bf4dc0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error4.C
@@ -0,0 +1,10 @@
+// PR c++/12160
+// { dg-options "-fshow-column" }
+
+struct X {
+ virtual void f(int,
+ itn,
+ int);
+};
+
+// { dg-error "4:'itn' has not been declared" "" { target *-*-* } 6 }
diff --git a/gcc/testsuite/g++.dg/parse/error5.C b/gcc/testsuite/g++.dg/parse/error5.C
new file mode 100644
index 000000000..eb1f9c730
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error5.C
@@ -0,0 +1,19 @@
+// PR c++/13269
+// { dg-options "-fshow-column" }
+
+class Foo { int foo() return 0; } };
+
+// { dg-error "30:expected identifier before numeric constant" "identifier" { target *-*-* } 4 }
+
+// { dg-error "23:named return values are no longer supported" "named return" { target *-*-* } 4 }
+
+// the column number info of this error output is still wrong because the error
+// message has been generated by cp_parser_error() which does not
+// necessarily allow accurate column number display. At some point, we will
+// need make cp_parser_error() report more accurate column numbers.
+// { dg-error "30:expected '\{' at end of input" "brace" { target *-*-* } 4 }
+
+// { dg-error "33:expected ';' after class definition" "semicolon" {target *-*-* } 4 }
+
+// { dg-error "35:expected declaration before '\}' token" "declaration" {target *-*-* } 4 }
+
diff --git a/gcc/testsuite/g++.dg/parse/error6.C b/gcc/testsuite/g++.dg/parse/error6.C
new file mode 100644
index 000000000..8b8424fe3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error6.C
@@ -0,0 +1,11 @@
+// PR c++/10603
+// { dg-options "-fshow-column" }
+
+int f(int not) {
+ return 1-not;
+}
+
+// { dg-error "11:expected ',' or '...' before 'not' token" "" { target *-*-* } 4 }
+
+// { dg-error "15:expected primary\\-expression before ';' token" "" { target *-*-* } 5 }
+
diff --git a/gcc/testsuite/g++.dg/parse/error7.C b/gcc/testsuite/g++.dg/parse/error7.C
new file mode 100644
index 000000000..78b7caac9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error7.C
@@ -0,0 +1,7 @@
+// PR c++/12827
+// { dg-options "-fshow-column" }
+
+void f(int x
+ int y);
+
+// { dg-error "8:expected ',' or '...' before 'int'" "" { target *-*-* } 5 }
diff --git a/gcc/testsuite/g++.dg/parse/error8.C b/gcc/testsuite/g++.dg/parse/error8.C
new file mode 100644
index 000000000..6d3bf5a85
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error8.C
@@ -0,0 +1,9 @@
+// PR c++/13438
+// { dg-options "-fshow-column" }
+
+struct A { friend typename struct B; };
+
+
+// { dg-error "28:expected nested-name-specifier before 'struct'" "" { target *-*-* } 4 }
+// { dg-error "35:multiple types in one declaration" "" { target *-*-* } 4 }
+// { dg-error "12:friend declaration does not name a class or function" "" { target *-*-* } 4 }
diff --git a/gcc/testsuite/g++.dg/parse/error9.C b/gcc/testsuite/g++.dg/parse/error9.C
new file mode 100644
index 000000000..b16c84e81
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error9.C
@@ -0,0 +1,9 @@
+// PR c++/12613
+// { dg-options "-fshow-column" }
+
+enum { FOO = 1, BAR = 2 };
+int a[] = { FOO: 1, BAR: 2 };
+
+// the following 2 column locations are still not accurate enough
+// { dg-error "28:name 'FOO' used in a GNU-style designated initializer for an array" "" { target *-*-* } 5 }
+// { dg-error "28:name 'BAR' used in a GNU-style designated initializer for an array" "" { target *-*-* } 5 }
diff --git a/gcc/testsuite/g++.dg/parse/explicit1.C b/gcc/testsuite/g++.dg/parse/explicit1.C
new file mode 100644
index 000000000..35358749e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/explicit1.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Origin: stefaandr@hotmail.com
+
+// PR c++/12403: ICE when explicit specialization is not in
+// namespace scope.
+
+struct foo {
+ template<typename T> void bar (T &t) {}
+ template<> void bar<double>(double &t) {} // { dg-error "non-namespace|template|function" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/expr1.C b/gcc/testsuite/g++.dg/parse/expr1.C
new file mode 100644
index 000000000..2ef82185b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/expr1.C
@@ -0,0 +1,8 @@
+struct A {
+ A (int, int);
+ void f ();
+};
+
+void f (int a) {
+ A (a, a).f ();
+}
diff --git a/gcc/testsuite/g++.dg/parse/expr2.C b/gcc/testsuite/g++.dg/parse/expr2.C
new file mode 100644
index 000000000..32800e4f9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/expr2.C
@@ -0,0 +1,8 @@
+struct X {
+ X(double *data, double d0, double d1);
+};
+
+int foo(double d0) {
+ double * data;
+ X(data,d0,d0);
+}
diff --git a/gcc/testsuite/g++.dg/parse/expr3.C b/gcc/testsuite/g++.dg/parse/expr3.C
new file mode 100644
index 000000000..95d332f41
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/expr3.C
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* PR/18047 Test that operators have the right precedence. */
+/* by bonzini@gnu.org */
+
+#define test(lower, higher, a, b, c, d) \
+ test_(lower, higher, a, b, c, d, __LINE__)
+
+#define test_(lower, higher, a, b, c, d, line)\
+ test__(lower, higher, a, b, c, d, line)
+
+/* The first declaration tests that the parentheses are added correctly
+ by the expression parser. The second tests that the two possible
+ orderings of precedences do give different results. */
+#define test__(lower, higher, a, b, c, d, line) \
+ char test##line[ \
+ (a higher b lower c higher d) == \
+ ((a higher b) lower (c higher d)) \
+ ? 1 : -1]; \
+ char doublecheck##line[ \
+ (a higher b lower c higher d) == \
+ (a higher (b lower c) higher d) \
+ ? -1 : 1];
+
+test (||, &&, 1, 1, 0, 0)
+test (&&, |, 5, 1, 1, 19)
+test (|, ^, 1, 2, 2, 1)
+test (^, &, 1, 3, 2, 6)
+test (&, ==, 1, 3, 2, 0)
+test (==, <, 2, 0, 0, 0)
+test (<, <<, 2, 3, 6, 8)
+test (<<, +, 2, 3, 4, 5)
+test (+, *, 2, 6, 9, 13)
diff --git a/gcc/testsuite/g++.dg/parse/extern-C-1.C b/gcc/testsuite/g++.dg/parse/extern-C-1.C
new file mode 100644
index 000000000..60a634832
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/extern-C-1.C
@@ -0,0 +1,13 @@
+/* PR c++/4754 */
+/* { dg-do compile } */
+// GCC 3.2 got very confused by the nested extern "C" blocks, and thought
+// there was a storage class specifier on 'int i'.
+
+extern "C"
+{
+ extern "C" struct Test
+ {
+ int i;
+ };
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/extern1.C b/gcc/testsuite/g++.dg/parse/extern1.C
new file mode 100644
index 000000000..cc95fa694
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/extern1.C
@@ -0,0 +1,14 @@
+// PR c++/21495
+// { dg-do compile }
+
+class A
+{
+ extern void *copy (void) // { dg-error "storage class specified" }
+ {
+ return 0;
+ }
+ extern A &operator= (const A &) // { dg-error "storage class specified" }
+ {
+ return *this;
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/fn-typedef1.C b/gcc/testsuite/g++.dg/parse/fn-typedef1.C
new file mode 100644
index 000000000..ebdc012f5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/fn-typedef1.C
@@ -0,0 +1,19 @@
+// PR c++/40750
+// { dg-do run }
+
+extern "C" void abort ();
+
+typedef void Fn() const;
+
+struct Foo {
+ Fn fn;
+};
+
+bool called = false;
+void Foo::fn() const { called = true; }
+
+int main() {
+ Foo f; f.fn();
+ if (!called)
+ abort();
+}
diff --git a/gcc/testsuite/g++.dg/parse/fn-typedef2.C b/gcc/testsuite/g++.dg/parse/fn-typedef2.C
new file mode 100644
index 000000000..c9c7f060d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/fn-typedef2.C
@@ -0,0 +1,7 @@
+// Test that merge_types preserves fn cv-quals.
+
+typedef void ft() const;
+typedef void V;
+typedef V ft() const;
+
+ft f; // { dg-error "qualified" }
diff --git a/gcc/testsuite/g++.dg/parse/for1.C b/gcc/testsuite/g++.dg/parse/for1.C
new file mode 100644
index 000000000..1e310ee02
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/for1.C
@@ -0,0 +1,7 @@
+// PR c++/23440
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+// { dg-options "" }
+
+# 0 "for1.C"
+void foo() { for (;;) // { dg-error "at end of input" "" { target *-*-* } 0 }
diff --git a/gcc/testsuite/g++.dg/parse/friend1.C b/gcc/testsuite/g++.dg/parse/friend1.C
new file mode 100644
index 000000000..f19dc9c62
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/friend1.C
@@ -0,0 +1,9 @@
+namespace N {
+ template <typename T>
+ static void f ();
+
+ struct S {
+ friend void N::f<int> ();
+ static void f (int);
+ };
+}
diff --git a/gcc/testsuite/g++.dg/parse/friend2.C b/gcc/testsuite/g++.dg/parse/friend2.C
new file mode 100644
index 000000000..1a2ad8bfa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/friend2.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// Origin: <struppi@acm.org>
+
+// PR c++/8591
+// Template or class detection in friend declaration
+
+namespace NS {
+ template <class T1, class T2, class T3 = int, class T4 = int>
+ struct C {};
+}
+
+template <class T> class X {
+ friend class NS::C; // { dg-error "template|friend" }
+};
+
+X<int> c;
diff --git a/gcc/testsuite/g++.dg/parse/friend3.C b/gcc/testsuite/g++.dg/parse/friend3.C
new file mode 100644
index 000000000..39322021e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/friend3.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+//
+// PR 11553 catch duplicate friend specifiers
+
+struct S
+{
+ friend friend class C; // { dg-error "duplicate" }
+};
+
+
diff --git a/gcc/testsuite/g++.dg/parse/friend4.C b/gcc/testsuite/g++.dg/parse/friend4.C
new file mode 100644
index 000000000..5eca512e1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/friend4.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+// PR c++/4100
+// You can't use friend when defining a class.
+
+class A {
+ friend class B { }; // { dg-error "friend" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/friend5.C b/gcc/testsuite/g++.dg/parse/friend5.C
new file mode 100644
index 000000000..ec134c26e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/friend5.C
@@ -0,0 +1,8 @@
+// PR c++/23694
+
+extern "C" struct A
+{
+ friend void foo(int) {} // { dg-error "declaration" }
+ friend void foo() {} // { dg-error "foo" "err" }
+ // { dg-warning "already a friend" "warn" { target *-*-* } 6 }
+};
diff --git a/gcc/testsuite/g++.dg/parse/friend6.C b/gcc/testsuite/g++.dg/parse/friend6.C
new file mode 100644
index 000000000..2d13606cb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/friend6.C
@@ -0,0 +1,3 @@
+// PR c++/27808
+
+template<typename T> friend void T::foo; // { dg-error "friend|invalid" }
diff --git a/gcc/testsuite/g++.dg/parse/friend7.C b/gcc/testsuite/g++.dg/parse/friend7.C
new file mode 100644
index 000000000..668fd35d3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/friend7.C
@@ -0,0 +1,37 @@
+// PR c++/34488
+// { dg-do compile }
+
+struct A
+{
+ A ();
+ ~A ();
+ A (const A &);
+};
+
+struct B
+{
+ friend A::A ();
+ friend A::~A ();
+ friend A::A (const A &);
+};
+
+struct C
+{
+ friend int C (); // { dg-error "return type|in friend decl" }
+ friend int ~C (); // { dg-error "return type|in friend decl" }
+ friend int C (const C &); // { dg-error "return type|in friend decl" }
+};
+
+struct D
+{
+ friend int D () {} // { dg-error "return type|in friend decl" }
+ friend int ~D () {} // { dg-error "return type|in friend decl" }
+ friend int D (const D &) {} // { dg-error "return type|in friend decl" }
+};
+
+struct E
+{
+ friend A::A () {} // { dg-error "cannot define member" }
+ friend A::~A () {} // { dg-error "cannot define member" }
+ friend A::A (const A &) {} // { dg-error "cannot define member" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/friend8.C b/gcc/testsuite/g++.dg/parse/friend8.C
new file mode 100644
index 000000000..aac5f0e55
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/friend8.C
@@ -0,0 +1,8 @@
+// PR c++/35578
+// Check position of error message
+// { dg-do compile }
+
+int i;
+
+friend // { dg-error "friend" }
+ void foo();
diff --git a/gcc/testsuite/g++.dg/parse/func-def1.C b/gcc/testsuite/g++.dg/parse/func-def1.C
new file mode 100644
index 000000000..00c973d88
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/func-def1.C
@@ -0,0 +1,11 @@
+// PR c++/7917
+// Origin: VACLAV HAISMAN <V.Haisman@sh.cvut.cz>
+// { dg-do compile }
+
+struct A
+{
+ int i;
+ void foo() = 0 {} // { dg-error "" }
+
+ A() : i(0) {}
+};
diff --git a/gcc/testsuite/g++.dg/parse/funptr1.C b/gcc/testsuite/g++.dg/parse/funptr1.C
new file mode 100644
index 000000000..bf63c122e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/funptr1.C
@@ -0,0 +1,13 @@
+// PR c++/9282
+// Origin: Thomas Richter <thor@math.tu-berlin.de>
+// { dg-do compile }
+
+typedef void (*fptr)();
+
+struct A
+{
+ template<int> static void foo() {}
+ template<fptr f> static void bar() { (*f)(); }
+};
+
+fptr f = A::bar< A::foo<0> >;
diff --git a/gcc/testsuite/g++.dg/parse/fused-params1.C b/gcc/testsuite/g++.dg/parse/fused-params1.C
new file mode 100644
index 000000000..33732fc28
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/fused-params1.C
@@ -0,0 +1,12 @@
+// PR c++/8785
+// Origin: Alexander Zvyagin <Alexander.Zviagine@cern.ch>
+// { dg-do compile }
+
+template <int N,typename T> struct A // { dg-error "" }
+{
+ typedef T X;
+ template <int M> void foo (const A<M,X>&);
+};
+
+template <int N,int M,typename T>
+void A<N,T>::foo (const A<M,X>&) {} // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/inline1.C b/gcc/testsuite/g++.dg/parse/inline1.C
new file mode 100644
index 000000000..5c3034c6e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/inline1.C
@@ -0,0 +1,7 @@
+struct f
+{
+ int oo()
+ {
+ return (2; // { dg-error "" }
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/int-as-enum1.C b/gcc/testsuite/g++.dg/parse/int-as-enum1.C
new file mode 100644
index 000000000..7c37eb087
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/int-as-enum1.C
@@ -0,0 +1,6 @@
+// PR c++/4207
+// Origin: <wanderer@rsu.ru>
+// { dg-do compile }
+
+typedef int A; // { dg-error "previous" }
+enum ::A {}; // { dg-error "typedef-name|expected unqualified-id" }
diff --git a/gcc/testsuite/g++.dg/parse/invalid-op1.C b/gcc/testsuite/g++.dg/parse/invalid-op1.C
new file mode 100644
index 000000000..0b75d0791
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/invalid-op1.C
@@ -0,0 +1,14 @@
+// PR c++/10150
+// Origin: Tom Evans <te200@eng.cam.ac.uk>
+// { dg-do compile }
+
+template <int I> struct A
+{
+ template <int> struct B
+ {
+ enum { e = I * A<I-1>::B }; // { dg-error "dependent-name" "depname" }
+ // { dg-message "note" "note" { target *-*-* } 9 }
+ };
+};
+
+A<0>::B<0> a; // { dg-message "instantiated" }
diff --git a/gcc/testsuite/g++.dg/parse/limits-initializer1.C b/gcc/testsuite/g++.dg/parse/limits-initializer1.C
new file mode 100644
index 000000000..4b507912f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/limits-initializer1.C
@@ -0,0 +1,37 @@
+// PR middle-end/42803
+// { dg-do compile }
+// { dg-options "-O0" }
+
+#define X2 (a + a)
+#define X4 (X2 + X2)
+#define X8 (X4 + X4)
+#define X16 (X8 + X8)
+#define X32 (X16 + X16)
+#define X64 (X32 + X32)
+#define X128 (X64 + X64)
+#define X256 (X128 + X128)
+#define X512 (X256 + X256)
+#define X1024 (X512 + X512)
+#define X2048 (X1024 + X1024)
+#define X4096 (X2048 + X2048)
+#define X8192 (X4096 + X4096)
+#define X16384 (X8192 + X8192)
+#define X32768 (X16384 + X16384)
+#define X65536 (X32768 + X32768)
+#define X131072 (X65536 + X65536)
+#define X262144 (X131072 + X131072)
+
+int
+foo (int a)
+{
+ int v = X262144;
+ return v;
+}
+
+// Emit an error to just make sure we don't waste too much time
+// in the middle-end compiling this.
+int
+bar (void)
+{
+ return x; // { dg-error "was not declared in this scope" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/linkage1.C b/gcc/testsuite/g++.dg/parse/linkage1.C
new file mode 100644
index 000000000..4a0d8942e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/linkage1.C
@@ -0,0 +1,11 @@
+// PR c++/26068
+
+extern "C" auto int a; // { dg-error "linkage" }
+extern "C" register int b; // { dg-error "linkage" }
+extern "C" static void c(); // { dg-error "linkage" }
+extern "C" extern void d(); // { dg-error "linkage" }
+extern "C" mutable int e; // { dg-error "linkage" }
+
+extern "C" {
+ static void f();
+}
diff --git a/gcc/testsuite/g++.dg/parse/linkage2.C b/gcc/testsuite/g++.dg/parse/linkage2.C
new file mode 100644
index 000000000..aa204df2a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/linkage2.C
@@ -0,0 +1,3 @@
+// PR c++/27884
+
+extern "C" void foo(register int *my_perl);
diff --git a/gcc/testsuite/g++.dg/parse/linkage3.C b/gcc/testsuite/g++.dg/parse/linkage3.C
new file mode 100644
index 000000000..0d952d1e6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/linkage3.C
@@ -0,0 +1,7 @@
+// PR c++/37877
+// { dg-do compile }
+
+extern "C++" struct S
+{
+ static int x;
+} s;
diff --git a/gcc/testsuite/g++.dg/parse/local-class1.C b/gcc/testsuite/g++.dg/parse/local-class1.C
new file mode 100644
index 000000000..518dd7abd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/local-class1.C
@@ -0,0 +1,14 @@
+ // Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com>
+
+// Origin: Jorn Wolfgang Rennecke <amylaar@gcc.gnu.org>
+// Bug 19608: ICE on invalid
+
+
+void f ()
+{
+ class c
+ {
+ friend void g () { } // { dg-error "local class" "" }
+ };
+}
diff --git a/gcc/testsuite/g++.dg/parse/local1.C b/gcc/testsuite/g++.dg/parse/local1.C
new file mode 100644
index 000000000..cfcffc908
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/local1.C
@@ -0,0 +1,18 @@
+// PR c++/28056
+
+void f1();
+
+namespace N {
+ void f2();
+}
+
+class C {
+ static void f3();
+};
+
+void foo() {
+ void ::f1(); // { dg-error "qualified" }
+ void N::f2(); // { dg-error "qualified" }
+ void C::f3(); // { dg-error "qualified" }
+ void ::f4(); // { dg-error "qualified" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/long1.C b/gcc/testsuite/g++.dg/parse/long1.C
new file mode 100644
index 000000000..c22d79117
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/long1.C
@@ -0,0 +1,11 @@
+// PR c++/6634
+// { dg-do compile }
+// { dg-options "" }
+
+long long double x; // { dg-error "long long" }
+long double y;
+long float z; // { dg-error "long" }
+
+typedef short void SV; // { dg-error "short" }
+typedef long struct A LA; // { dg-error "long" }
+typedef short char SC; // { dg-error "short" }
diff --git a/gcc/testsuite/g++.dg/parse/lookup1.C b/gcc/testsuite/g++.dg/parse/lookup1.C
new file mode 100644
index 000000000..0325d3c69
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/lookup1.C
@@ -0,0 +1,9 @@
+#include <list>
+
+using namespace std;
+
+template <class T, class Alloc>
+class new_list : public list<T, Alloc> {
+public:
+ typedef typename list<T, Alloc>::iterator iterator;
+};
diff --git a/gcc/testsuite/g++.dg/parse/lookup2.C b/gcc/testsuite/g++.dg/parse/lookup2.C
new file mode 100644
index 000000000..fcf17cde4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/lookup2.C
@@ -0,0 +1,21 @@
+template <typename T> struct A
+{
+ typedef int X;
+};
+
+template <typename T> struct B
+{
+ typename A<T>::X x;
+};
+
+template <typename T> struct C
+{
+ void foo(int);
+ B<A<T>*> b;
+};
+
+template <typename T> struct D
+{
+ enum { e };
+ void bar() { C<T*>::foo(e); }
+};
diff --git a/gcc/testsuite/g++.dg/parse/lookup3.C b/gcc/testsuite/g++.dg/parse/lookup3.C
new file mode 100644
index 000000000..d4bf79830
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/lookup3.C
@@ -0,0 +1,12 @@
+struct X {};
+
+template <int>
+struct Base {
+ static void foo () {
+ X::NONEXISTENT (); // { dg-error "" }
+ }
+};
+
+int main () {
+ Base<2>::foo ();
+}
diff --git a/gcc/testsuite/g++.dg/parse/lookup4.C b/gcc/testsuite/g++.dg/parse/lookup4.C
new file mode 100644
index 000000000..01e5662ad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/lookup4.C
@@ -0,0 +1,7 @@
+// PR c++/16637
+
+typedef int I;
+
+struct S {
+ ::I I;
+};
diff --git a/gcc/testsuite/g++.dg/parse/lookup5.C b/gcc/testsuite/g++.dg/parse/lookup5.C
new file mode 100644
index 000000000..afdf023b5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/lookup5.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+
+struct A {};
+
+template <class T> struct B
+{
+ T a, b;
+ B() {}
+ B(T x, T y) : a(x), b(y) {}
+ template <class U> operator B<U> () const
+ { return B<U>((U)(this->a), (U)(this->b)); }
+};
+
+template <class T> struct C : public B<int>
+{
+ T *c;
+ inline T & operator *() { return *c; }
+};
+
+template <class T> struct D : virtual public C<T> { };
+
+void
+foo (D<A> x)
+{
+ *x;
+}
diff --git a/gcc/testsuite/g++.dg/parse/memfnquals1.C b/gcc/testsuite/g++.dg/parse/memfnquals1.C
new file mode 100644
index 000000000..ce8af7b72
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/memfnquals1.C
@@ -0,0 +1,6 @@
+// PR c++/48166
+
+struct foo {
+ static void func ();
+};
+void foo::func () const {} // { dg-error "type qualifiers" }
diff --git a/gcc/testsuite/g++.dg/parse/missing-template1.C b/gcc/testsuite/g++.dg/parse/missing-template1.C
new file mode 100644
index 000000000..e5e03146d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/missing-template1.C
@@ -0,0 +1,23 @@
+// PR c++/8736
+// Origin: Peter Kolloch <pkolloch@gmx.ne>
+// { dg-do compile }
+
+template <typename T> struct A
+{
+ template <typename U> struct B
+ {
+ typedef int X;
+ };
+};
+
+template <typename T> void foo()
+{
+ typedef typename A<T>::B<T>::X Y; // { dg-error "non-template" "non" }
+ // { dg-error "not declare" "decl" { target *-*-* } 15 }
+ // { dg-message "note" "note" { target *-*-* } 15 }
+}
+
+void bar()
+{
+ foo<int>();
+}
diff --git a/gcc/testsuite/g++.dg/parse/mutable1.C b/gcc/testsuite/g++.dg/parse/mutable1.C
new file mode 100644
index 000000000..f3ac2e4a9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/mutable1.C
@@ -0,0 +1,7 @@
+// PR c++/16518
+
+struct foo {
+ void bar() const { m1=1; m2=1;}
+ mutable int m1,m2;
+};
+
diff --git a/gcc/testsuite/g++.dg/parse/named_ops.C b/gcc/testsuite/g++.dg/parse/named_ops.C
new file mode 100644
index 000000000..80e514992
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/named_ops.C
@@ -0,0 +1,13 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc. */
+
+/* { dg-do compile } */
+/* { dg-options -fpreprocessed } */
+
+/* Tests that C++ named ops are still there with -fpreprocessed. */
+
+/* Source: Neil Booth, 23 May 2002. */
+
+int main ()
+{
+ return 2 xor 2;
+}
diff --git a/gcc/testsuite/g++.dg/parse/namespace-definition.C b/gcc/testsuite/g++.dg/parse/namespace-definition.C
new file mode 100644
index 000000000..b7d4034cd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace-definition.C
@@ -0,0 +1,10 @@
+// PR 30891
+// { dg-do compile }
+
+int main() {
+ int i = 0;
+ namespace foo { // { dg-error "'namespace' definition is not allowed here" }
+ int j = 0;
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/namespace1.C b/gcc/testsuite/g++.dg/parse/namespace1.C
new file mode 100644
index 000000000..7740bce2d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace1.C
@@ -0,0 +1,7 @@
+namespace foo {
+void baz(int);
+}
+
+int bar(int foo) {
+ foo::baz (3);
+}
diff --git a/gcc/testsuite/g++.dg/parse/namespace10.C b/gcc/testsuite/g++.dg/parse/namespace10.C
new file mode 100644
index 000000000..9f93d1b68
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace10.C
@@ -0,0 +1,9 @@
+// PR c++/16529
+
+namespace m {} // { dg-error "" }
+
+namespace n {
+ namespace m {}
+}
+
+namespace m = n::m; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/namespace11.C b/gcc/testsuite/g++.dg/parse/namespace11.C
new file mode 100644
index 000000000..7fa73b6e3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace11.C
@@ -0,0 +1,7 @@
+// PR c++/43069
+
+namespace std {
+ template < typename >
+ void swap ();
+}
+template std::swap // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/namespace12.C b/gcc/testsuite/g++.dg/parse/namespace12.C
new file mode 100644
index 000000000..25d6ae093
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace12.C
@@ -0,0 +1,7 @@
+// PR c++/43109
+
+namespace std {
+ namespace {
+ struct S {};
+ }
+}
diff --git a/gcc/testsuite/g++.dg/parse/namespace2.C b/gcc/testsuite/g++.dg/parse/namespace2.C
new file mode 100644
index 000000000..a2c10e053
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace2.C
@@ -0,0 +1,15 @@
+/* PR c++/2537 */
+/* { dg-do compile } */
+
+// Used to have namespace name/identifier conflict, prior to 3.4.
+
+namespace baz {}
+
+namespace foo
+ {
+ struct bar
+ {
+ unsigned baz:1;
+ };
+ }
+
diff --git a/gcc/testsuite/g++.dg/parse/namespace3.C b/gcc/testsuite/g++.dg/parse/namespace3.C
new file mode 100644
index 000000000..4665d0e9e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace3.C
@@ -0,0 +1,12 @@
+/* PR c+/3816 */
+/* { dg-do compile } */
+namespace A {}
+
+namespace OtherNamespace {
+
+ typedef struct {
+ int member;
+ } A; // used to conflict with A namespace
+
+} // end of namespace
+
diff --git a/gcc/testsuite/g++.dg/parse/namespace4.C b/gcc/testsuite/g++.dg/parse/namespace4.C
new file mode 100644
index 000000000..2bee8dda8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace4.C
@@ -0,0 +1,18 @@
+/* PR c++/4652 */
+/* { dg-do compile } */
+/* Another conflict between namespace IDs and other things. */
+
+namespace A { }
+
+class B {
+
+ struct {
+ int x;
+ } A;
+
+};
+
+int main() {
+ B b;
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/namespace5.C b/gcc/testsuite/g++.dg/parse/namespace5.C
new file mode 100644
index 000000000..277c0c8e6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace5.C
@@ -0,0 +1,5 @@
+// PR c++/7229
+// { dg-do compile }
+
+namespace A { namespace B { typedef int type; } }
+typename A::B<0>::type x; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/namespace6.C b/gcc/testsuite/g++.dg/parse/namespace6.C
new file mode 100644
index 000000000..06642d429
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace6.C
@@ -0,0 +1,10 @@
+namespace a {
+ namespace b {
+ void foo();
+ }
+}
+
+void
+a::b:foo() // { dg-error "" }
+{
+}
diff --git a/gcc/testsuite/g++.dg/parse/namespace7.C b/gcc/testsuite/g++.dg/parse/namespace7.C
new file mode 100644
index 000000000..c8ac60882
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace7.C
@@ -0,0 +1,8 @@
+namespace O {
+ struct SO;
+ namespace I {
+ struct SI;
+ struct O::SO {}; // { dg-error "" }
+ }
+ struct I::SI {};
+}
diff --git a/gcc/testsuite/g++.dg/parse/namespace8.C b/gcc/testsuite/g++.dg/parse/namespace8.C
new file mode 100644
index 000000000..d5a9b0ac1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace8.C
@@ -0,0 +1,6 @@
+namespace X {
+ typedef struct {
+ } x;
+}
+typedef X::x x;
+using X::x;
diff --git a/gcc/testsuite/g++.dg/parse/namespace9.C b/gcc/testsuite/g++.dg/parse/namespace9.C
new file mode 100644
index 000000000..7ff0267bf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace9.C
@@ -0,0 +1,8 @@
+namespace A {
+ void f();
+}
+int g()
+{
+ struct f { };
+ using A::f;
+}
diff --git a/gcc/testsuite/g++.dg/parse/new1.C b/gcc/testsuite/g++.dg/parse/new1.C
new file mode 100644
index 000000000..d61c44633
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/new1.C
@@ -0,0 +1,7 @@
+struct T; // { dg-error "forward" }
+T* manage(T* t);
+template <class Obj> struct ObjectSlot0_ {
+ void create() {
+ void* tmp = manage(new T()); // { dg-error "incomplete" }
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/new2.C b/gcc/testsuite/g++.dg/parse/new2.C
new file mode 100644
index 000000000..d233b68ca
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/new2.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// Contributed by David Daney <daney at gcc dot gnu dot org>
+// PR c++/14181: Cryptic error message for ill-formed new expressions
+
+void f1(void)
+{
+ (void)new (char*)[10]; // { dg-error "parenthesized|parentheses" }
+ (void)new char*[10];
+}
diff --git a/gcc/testsuite/g++.dg/parse/new3.C b/gcc/testsuite/g++.dg/parse/new3.C
new file mode 100644
index 000000000..d8faed294
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/new3.C
@@ -0,0 +1,4 @@
+// PR c++/28593
+// { dg-do compile }
+
+void *p = new (::X; // { dg-error "declared|type-specifier" }
diff --git a/gcc/testsuite/g++.dg/parse/new4.C b/gcc/testsuite/g++.dg/parse/new4.C
new file mode 100644
index 000000000..34bd23230
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/new4.C
@@ -0,0 +1,7 @@
+// PR c++/29291
+// { dg-do compile }
+
+template<int> void foo()
+{
+ new int(; // { dg-error "before" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/no-type-defn1.C b/gcc/testsuite/g++.dg/parse/no-type-defn1.C
new file mode 100644
index 000000000..9e899579e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/no-type-defn1.C
@@ -0,0 +1,5 @@
+// PR c++/47144
+
+template<typename> struct A { };
+A< struct B { }* >::SomeNonSense // { dg-error "types may not be defined" }
+int y;
diff --git a/gcc/testsuite/g++.dg/parse/no-typename1.C b/gcc/testsuite/g++.dg/parse/no-typename1.C
new file mode 100644
index 000000000..42059ce7b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/no-typename1.C
@@ -0,0 +1,11 @@
+// PR c++/4903
+// Origin: Dan Marinescu <theverylittleone@hotmail.com>
+// { dg-do compile }
+
+template <typename T> struct A
+{
+ template <typename U> struct B
+ {
+ A<T>::template B<U> foo(); // { dg-error "" }
+ };
+};
diff --git a/gcc/testsuite/g++.dg/parse/no-value1.C b/gcc/testsuite/g++.dg/parse/no-value1.C
new file mode 100644
index 000000000..443a389ce
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/no-value1.C
@@ -0,0 +1,14 @@
+// PR c++/5533
+// { dg-do compile }
+
+namespace N
+{
+ template <class T> struct A{};
+}
+
+template <class T> void foo(T) {}
+
+void bar()
+{
+ foo(N::A); // { dg-error "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/non-dependent1.C b/gcc/testsuite/g++.dg/parse/non-dependent1.C
new file mode 100644
index 000000000..d85ecb13a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/non-dependent1.C
@@ -0,0 +1,19 @@
+// PR c++/8921
+// Origin: Chin-Lung Chang <evirt@iis.sinica.edu.tw>
+// { dg-do compile }
+
+struct A
+{
+ template <typename T> void foo();
+};
+
+template <typename T> void bar(A& a)
+{
+ a.foo<T>();
+}
+
+void baz()
+{
+ A a;
+ bar<int>(a);
+}
diff --git a/gcc/testsuite/g++.dg/parse/non-dependent2.C b/gcc/testsuite/g++.dg/parse/non-dependent2.C
new file mode 100644
index 000000000..4df2da7fa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/non-dependent2.C
@@ -0,0 +1,37 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Jul 2003 <nathan@codesourcery.com>
+
+// A non-dependent field_decl can bind at parse time.
+
+template <class T>
+struct Foo {
+ int j; // we never see this one.
+ int k; // { dg-error "Foo" "" }
+
+};
+
+struct Baz
+{
+ int j;
+ int k; // { dg-error "candidates" "" }
+
+};
+
+template <class T>
+struct Bar : public Foo<T>, Baz {
+
+ int baz () { return j; } // binds to Baz::j
+ int foo () { return this->k; } // { dg-error "request for member" "" }
+};
+
+int main()
+{
+ Bar<int> bar;
+
+ bar.baz ();
+ bar.foo (); // { dg-message "instantiated" "" }
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/non-dependent3.C b/gcc/testsuite/g++.dg/parse/non-dependent3.C
new file mode 100644
index 000000000..9dfb99636
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/non-dependent3.C
@@ -0,0 +1,17 @@
+// PR c++/14586
+
+enum E { e };
+
+E & operator |= (E &f1, const E &f2);
+
+E operator | (const E &f1, const E &f2) {
+ E result = f1;
+ result |= f2;
+ return result;
+}
+
+template <typename> void foo () {
+ const E flags = e | e;
+}
+
+template void foo<double> ();
diff --git a/gcc/testsuite/g++.dg/parse/non-templ1.C b/gcc/testsuite/g++.dg/parse/non-templ1.C
new file mode 100644
index 000000000..07bb3793a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/non-templ1.C
@@ -0,0 +1,10 @@
+// PR c++/9228
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+struct A
+{
+ struct B { B(int); };
+};
+
+template <typename T> typename A<T>::B foo() { return 1; } // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/nontype1.C b/gcc/testsuite/g++.dg/parse/nontype1.C
new file mode 100644
index 000000000..e721700af
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/nontype1.C
@@ -0,0 +1,9 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// PR c++/13289: Incorrectly reject non-type template argument that has
+// dependent type
+
+template <class T, T t> class C {};
+template <class T, T t> class D { C<T, t-1> c; };
diff --git a/gcc/testsuite/g++.dg/parse/octal1.C b/gcc/testsuite/g++.dg/parse/octal1.C
new file mode 100644
index 000000000..8d62eef3c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/octal1.C
@@ -0,0 +1 @@
+int i = 08; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/offsetof1.C b/gcc/testsuite/g++.dg/parse/offsetof1.C
new file mode 100644
index 000000000..ae9d3110a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof1.C
@@ -0,0 +1,11 @@
+#include <stddef.h>
+
+template <bool> struct StaticAssert;
+template <> struct StaticAssert<true> {};
+
+struct MyPOD
+{
+ int a; int b; int c;
+};
+
+StaticAssert<(offsetof(MyPOD, a) == 0)> s;
diff --git a/gcc/testsuite/g++.dg/parse/offsetof2.C b/gcc/testsuite/g++.dg/parse/offsetof2.C
new file mode 100644
index 000000000..4552d39fe
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof2.C
@@ -0,0 +1,12 @@
+#include <cstddef>
+
+struct choke_me
+{
+ int size;
+ char storage[1];
+};
+
+struct offset_is_broken
+{
+ static const int offset = offsetof(choke_me, storage);
+};
diff --git a/gcc/testsuite/g++.dg/parse/offsetof3.C b/gcc/testsuite/g++.dg/parse/offsetof3.C
new file mode 100644
index 000000000..905e5f58a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof3.C
@@ -0,0 +1,11 @@
+// PR c++/13529
+
+#include <cstddef>
+
+struct A { int i; };
+struct B { A a; };
+
+int main()
+{
+ return offsetof(B,a.i) != 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/offsetof4.C b/gcc/testsuite/g++.dg/parse/offsetof4.C
new file mode 100644
index 000000000..ba051480d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof4.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// Contributed by Bill Helfinstine <bhelf at flitterfly dot whirpon dot com>
+// PR c++/14932: Allow subscript operator in offsetof
+
+#include <cstddef>
+
+struct A
+{
+ int bar;
+ int foo[22];
+};
+
+const int off = offsetof(A, foo[12]);
diff --git a/gcc/testsuite/g++.dg/parse/offsetof5.C b/gcc/testsuite/g++.dg/parse/offsetof5.C
new file mode 100644
index 000000000..553e33ded
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof5.C
@@ -0,0 +1,13 @@
+// PR c++/16618
+
+#include <stddef.h>
+
+struct test
+{
+ const char a;
+};
+
+int main()
+{
+ offsetof(test,a);
+}
diff --git a/gcc/testsuite/g++.dg/parse/offsetof6.C b/gcc/testsuite/g++.dg/parse/offsetof6.C
new file mode 100644
index 000000000..0e07a5380
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof6.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+// From PR28573
+
+struct A
+{
+ char d[44];
+ char &operator [] ( int indx ) { return d[indx]; }
+};
+
+struct B
+{
+ A a;
+};
+
+int main()
+{
+ return __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply.*offsetof" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/offsetof7.C b/gcc/testsuite/g++.dg/parse/offsetof7.C
new file mode 100644
index 000000000..113a79547
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof7.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+// From PR28573
+
+struct A
+{
+ int operator [] ( int indx ) { return indx; }
+};
+
+struct B
+{
+ A a;
+};
+
+int main()
+{
+ return __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply.*offsetof" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/offsetof8.C b/gcc/testsuite/g++.dg/parse/offsetof8.C
new file mode 100644
index 000000000..e613ddcbb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof8.C
@@ -0,0 +1,16 @@
+// PR c++/35321
+
+struct A
+{
+ A operator[] (int);
+};
+
+struct B
+{
+ A a;
+};
+
+void foo()
+{
+ __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply 'offsetof' when 'operator\\\[\\\]' is overloaded" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/offsetof9.C b/gcc/testsuite/g++.dg/parse/offsetof9.C
new file mode 100644
index 000000000..efc103837
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof9.C
@@ -0,0 +1,32 @@
+/* PR c/32041 */
+/* { dg-do run } */
+
+struct S
+{
+ int c;
+ struct { float f; } sa[2];
+};
+
+char a[__builtin_offsetof (S, sa->f)
+ == __builtin_offsetof (S, sa[0].f) ? 1 : -1];
+
+template <int N>
+struct T
+{
+ int c[N];
+ struct { float f; } sa[N];
+ static int foo () { return __builtin_offsetof (T, sa->f); }
+ static int bar () { return __builtin_offsetof (T, sa[0].f); }
+};
+
+char b[__builtin_offsetof (T<5>, sa->f)
+ == __builtin_offsetof (T<5>, sa[0].f) ? 1 : -1];
+
+int
+main ()
+{
+ if (T<1>::foo () != T<1>::bar ())
+ __builtin_abort ();
+ if (T<7>::foo () != T<7>::bar ())
+ __builtin_abort ();
+}
diff --git a/gcc/testsuite/g++.dg/parse/operator1.C b/gcc/testsuite/g++.dg/parse/operator1.C
new file mode 100644
index 000000000..3a534d182
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/operator1.C
@@ -0,0 +1,11 @@
+/* PR c++/8982 */
+/* { dg-do compile } */
+namespace foo {
+ template<class X>
+ int operator- (X x);
+}
+
+int main() {
+ using foo::operator-; // syntax error under gcc 3.2
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/operator2.C b/gcc/testsuite/g++.dg/parse/operator2.C
new file mode 100644
index 000000000..a9ebde0d4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/operator2.C
@@ -0,0 +1,15 @@
+// PR c++/7906
+// Origin: Marcel Loose <loose@astron.nl>
+// { dg-do compile }
+
+template <typename> struct A { typedef int X; };
+
+template <typename T> struct B
+{
+ typedef A<T> Y;
+ struct C { operator typename Y::X() const; };
+};
+
+template <typename T> B<T>::C::operator typename B<T>::Y::X() const { return 0; }
+
+B<int> b;
diff --git a/gcc/testsuite/g++.dg/parse/operator3.C b/gcc/testsuite/g++.dg/parse/operator3.C
new file mode 100644
index 000000000..08f5c83f2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/operator3.C
@@ -0,0 +1,11 @@
+// PR c++/9454
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <int> struct A
+{
+ struct B { operator int (); };
+ struct C : B { operator int (); };
+};
+
+A<0> a;
diff --git a/gcc/testsuite/g++.dg/parse/operator4.C b/gcc/testsuite/g++.dg/parse/operator4.C
new file mode 100644
index 000000000..054ddc835
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/operator4.C
@@ -0,0 +1 @@
+int operator *(int, ...); // { dg-error "class|variable number of arguments" }
diff --git a/gcc/testsuite/g++.dg/parse/operator5.C b/gcc/testsuite/g++.dg/parse/operator5.C
new file mode 100644
index 000000000..3e453bdf3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/operator5.C
@@ -0,0 +1,7 @@
+// PR c++/17685
+
+struct S {
+ operator int; // { dg-error "" }
+ operator void; // { dg-error "" }
+};
+
diff --git a/gcc/testsuite/g++.dg/parse/operator6.C b/gcc/testsuite/g++.dg/parse/operator6.C
new file mode 100644
index 000000000..e58a3a682
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/operator6.C
@@ -0,0 +1,5 @@
+// PR c++/25635
+
+struct A {};
+
+A::operator int(); // { dg-error "class" }
diff --git a/gcc/testsuite/g++.dg/parse/operator7.C b/gcc/testsuite/g++.dg/parse/operator7.C
new file mode 100644
index 000000000..e3464f017
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/operator7.C
@@ -0,0 +1,4 @@
+// PR c++/27278
+// { dg-do compile }
+
+int operator+(void,void); // { dg-error "incomplete type|invalid use" }
diff --git a/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C b/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C
new file mode 100644
index 000000000..22d6f214d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C
@@ -0,0 +1,6 @@
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// Origin: Robert Schiele; PR C++/8799
+// { dg-do compile }
+
+struct {
+ a(void = 0; a(0), a(0) // { dg-error "" "" { target *-*-* } }
diff --git a/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C b/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C
new file mode 100644
index 000000000..7a9a24fb7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C
@@ -0,0 +1 @@
+void f (int i, int p[i]); // { dg-error "use of parameter .i. outside function body" }
diff --git a/gcc/testsuite/g++.dg/parse/parens1.C b/gcc/testsuite/g++.dg/parse/parens1.C
new file mode 100644
index 000000000..f63f50143
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parens1.C
@@ -0,0 +1,18 @@
+/* PR c++/8237 */
+/* { dg-do compile } */
+class A {
+public:
+ A() { }
+};
+
+class B {
+public:
+ B(A a) { }
+ void form() { }
+};
+
+int main() {
+ // This used to give a parse error.
+ B(A()).form();
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/parens2.C b/gcc/testsuite/g++.dg/parse/parens2.C
new file mode 100644
index 000000000..636dd8df3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parens2.C
@@ -0,0 +1,11 @@
+/* PR c++/8842. */
+/* { dg-do compile } */
+int main( int argc, char* argv[] )
+{
+ int i = 5;
+ // This always worked:
+ // double l1 = double(int(i)) / double(int(i));
+ // But this used to give a parse error before the `/' token:
+ double l2 = (double(int(i)) / double(int(i)));
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/parse1.C b/gcc/testsuite/g++.dg/parse/parse1.C
new file mode 100644
index 000000000..cbac6da15
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parse1.C
@@ -0,0 +1,9 @@
+/* PR c++/50 */
+/* { dg-do compile } */
+
+namespace A {typedef int Z;}
+int main(void)
+{
+ A::Z* z;
+ z->A::Z::~Z();
+}
diff --git a/gcc/testsuite/g++.dg/parse/parse2.C b/gcc/testsuite/g++.dg/parse/parse2.C
new file mode 100644
index 000000000..80a9e38f4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parse2.C
@@ -0,0 +1,8 @@
+/* PR c++/67 */
+/* { dg-do compile } */
+
+template <class T> struct foo {
+ static const int bar [3];
+};
+// Used to fail if 2+1 rather than 3.
+template <class T> const int foo<T>::bar [2+1] = { 0, 0, 0 };
diff --git a/gcc/testsuite/g++.dg/parse/parse3.C b/gcc/testsuite/g++.dg/parse/parse3.C
new file mode 100644
index 000000000..5f24cd159
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parse3.C
@@ -0,0 +1,7 @@
+/* PR c++/80 */
+/* { dg-do compile } */
+
+/* Used to get:
+ bug.C:7: semicolon missing after declaration of `numbers'
+*/
+enum numbers { zero, one, two, three } __attribute__ ((packed)) ;
diff --git a/gcc/testsuite/g++.dg/parse/parse4.C b/gcc/testsuite/g++.dg/parse/parse4.C
new file mode 100644
index 000000000..9df1754ab
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parse4.C
@@ -0,0 +1,25 @@
+/* PR c++/88 */
+/* { dg-do compile } */
+
+class Hvec
+{
+public:
+ Hvec(double x, double y, double z);
+ ~Hvec();
+};
+
+
+class Camera1
+{
+public:
+ Camera1(const Hvec &basepos=Hvec(0.0,0.0,0.0));
+ ~Camera1();
+};
+
+class Camera2
+{
+public:
+ Camera2(const Hvec &basepos);
+ inline Camera2() { Camera2(Hvec(0.0,0.0,0.0)); }
+ ~Camera2();
+};
diff --git a/gcc/testsuite/g++.dg/parse/parse5.C b/gcc/testsuite/g++.dg/parse/parse5.C
new file mode 100644
index 000000000..f9e6a0359
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parse5.C
@@ -0,0 +1,33 @@
+/* PR c++/590 */
+/* { dg-do compile } */
+
+#include <iostream>
+#include <sstream>
+using namespace std;
+
+enum ExternalEnum { EXTERNAL_VALUE = 2 };
+
+class BadStream : public ostringstream
+{
+public:
+ enum InternalEnum { VALUE = 0 };
+ BadStream( InternalEnum e ) {}
+ BadStream( InternalEnum e, int i ) {}
+};
+
+int main()
+{
+ ( BadStream( BadStream::VALUE ) ) << "foobar" << endl;
+
+ BadStream((BadStream::InternalEnum)BadStream::VALUE ) << "foobar";
+
+ BadStream::InternalEnum in = BadStream::VALUE;
+ BadStream( in ) << "foobar";
+
+ BadStream( BadStream::VALUE, 0 ) << "foobar" << endl;
+
+ // This didn't used to compile:
+ BadStream( BadStream::VALUE ) << "foobar" << endl;
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/parse6.C b/gcc/testsuite/g++.dg/parse/parse6.C
new file mode 100644
index 000000000..73f7256d3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parse6.C
@@ -0,0 +1,31 @@
+/* PR c++/3012 */
+/* { dg-do compile } */
+
+class A
+{
+ public:
+
+ template <class T>
+ void foo() const
+ {
+ }
+};
+
+template <class T>
+class B
+{
+ public:
+
+ void bar(const A& a) const
+ {
+ // Compile used to fail with parse error before `;' token
+ a.foo<double>();
+ }
+};
+
+int main()
+{
+ A a;
+ B<int> b;
+ b.bar(a);
+}
diff --git a/gcc/testsuite/g++.dg/parse/parse7.C b/gcc/testsuite/g++.dg/parse/parse7.C
new file mode 100644
index 000000000..3676ded4c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parse7.C
@@ -0,0 +1,24 @@
+/* PR c++/3650 */
+/* { dg-do compile } */
+
+class class1 {
+public:
+ explicit class1(double a) { data = a; }
+ double data;
+};
+
+class class2 {
+public:
+ class2(class1 a, float t) { }
+ class2(float t, class1 a) { }
+};
+
+int main() {
+ float t2 = 1.5;
+ double pir = 3.14159;
+ // Used to get: error: type specifier omitted for parameter `t2'
+ class2 h(class1(double(pir)), t2);
+ class2 i(class1(pir), t2);
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C b/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C
new file mode 100644
index 000000000..3510aac90
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C
@@ -0,0 +1,31 @@
+// PR 14875: When using 'or' keyword, the error message speaks of a '||' token
+// { dg-do compile }
+// { dg-options "" }
+#define CHECK(x) void ::x
+ CHECK (and); // { dg-error "before .and. token" }
+ CHECK (and_eq); // { dg-error "before .and_eq. token" }
+ CHECK (bitand); // { dg-error "before .bitand. token" }
+ CHECK (bitor); // { dg-error "before .bitor. token" }
+ CHECK (compl); // { dg-error "before .compl. token" }
+ CHECK (not); // { dg-error "before .not. token" }
+ CHECK (not_eq); // { dg-error "before .not_eq. token" }
+ CHECK (or); // { dg-error "before .or. token" }
+ CHECK (or_eq); // { dg-error "before .or_eq. token" }
+ CHECK (xor); // { dg-error "before .xor. token" }
+ CHECK (xor_eq); // { dg-error "before .xor_eq. token" }
+#undef CHECK
+#define CHECK(x) int x
+ CHECK (<:); // { dg-error "before .<:. token" }
+ CHECK (:>); // { dg-error "before .:>. token" }
+#undef CHECK
+#define CHECK(x) x
+ CHECK (<%); // { dg-error "before .<%. token" }
+#undef CHECK
+#define CHECK(x) x x
+ CHECK (%>); // { dg-error "before .%>. token" }
+#undef CHECK
+#define CHECK(x) x
+ CHECK (%:); // { dg-error "stray .%:. " }
+ CHECK (%:%:); // { dg-error "stray .%:%:. " }
+
+
diff --git a/gcc/testsuite/g++.dg/parse/parser-pr14875.C b/gcc/testsuite/g++.dg/parse/parser-pr14875.C
new file mode 100644
index 000000000..7a6f06186
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parser-pr14875.C
@@ -0,0 +1,20 @@
+// PR 14875: When using 'or' keyword, the error message speaks of a '||' token
+// { dg-do compile }
+// { dg-options "" }
+using namespace std;
+
+class Sample
+{
+
+public:
+ Sample();
+ void or(long Digital); // { dg-error "before .or. token" }
+};
+
+Sample::Sample()
+{
+}
+
+void Sample::or(long Digital) // { dg-error "before .or. token" }
+{
+}
diff --git a/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C b/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C
new file mode 100644
index 000000000..bcccb94a0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C
@@ -0,0 +1,13 @@
+/* PR 28152: error messages should mention __complex__ */
+/* { dg-do compile } */
+/* { dg-options "" } */
+int
+main (void)
+{
+ __complex__ float z;
+
+ z = __complex__ (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '__complex__'" }
+ // { dg-error "expected .;. before .__complex__." "" { target *-*-* } 9 }
+ z = __complex__ (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '__complex__'" }
+ // { dg-error "expected .;. before '__complex__'" "" { target *-*-* } 11 }
+ // { dg-error "at end of input" "" { target *-*-* } 11 }
diff --git a/gcc/testsuite/g++.dg/parse/parser-pr28152.C b/gcc/testsuite/g++.dg/parse/parser-pr28152.C
new file mode 100644
index 000000000..5b3a25e18
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/parser-pr28152.C
@@ -0,0 +1,13 @@
+/* PR 28152: error messages should mention _Complex */
+/* { dg-do compile } */
+/* { dg-options "" } */
+int
+main (void)
+{
+ _Complex float z;
+
+ z = _Complex (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '_Complex'" }
+ // { dg-error "expected .;. before ._Complex." "" { target *-*-* } 9 }
+ z = _Complex (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '_Complex'" }
+ // { dg-error "expected .;. before '_Complex'" "" { target *-*-* } 11 }
+ // { dg-error "at end of input" "" { target *-*-* } 11 }
diff --git a/gcc/testsuite/g++.dg/parse/pr16696-permissive.C b/gcc/testsuite/g++.dg/parse/pr16696-permissive.C
new file mode 100644
index 000000000..1d8a920ad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr16696-permissive.C
@@ -0,0 +1,17 @@
+// PR 16696 Strange message when operator++ not found
+// { dg-do compile }
+// { dg-options "-fdiagnostics-show-option -fpermissive" }
+
+
+struct X { void operator++(); };
+struct Y { };
+
+int main () {
+ X x;
+ Y y;
+ x++; // { dg-warning "trying prefix operator" }
+
+ y++; // { dg-warning "trying prefix operator" }
+ // { dg-error "no match" "" { target *-*-* } 14 }
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/pr16696.C b/gcc/testsuite/g++.dg/parse/pr16696.C
new file mode 100644
index 000000000..902e2a1a9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr16696.C
@@ -0,0 +1,17 @@
+// PR 16696 Strange message when operator++ not found
+// { dg-do compile }
+// { dg-options "-fdiagnostics-show-option" }
+
+
+struct X { void operator++(); };
+struct Y { };
+
+int main () {
+ X x;
+ Y y;
+ x++; // { dg-bogus "trying prefix operator" }
+ // { dg-error "fpermissive" "" { target *-*-* } 12 }
+ y++; // { dg-bogus "trying prefix operator" }
+ // { dg-error "fpermissive" "" { target *-*-* } 14 }
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/pr20118.C b/gcc/testsuite/g++.dg/parse/pr20118.C
new file mode 100644
index 000000000..94e000a6f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr20118.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-fshow-column" }
+template<typename t>struct foo {
+ static const int i; };
+
+const int foo<bool>::i = 5; // { dg-error "11:specializing member .foo<bool>::i. requires .template<>. syntax" }
+
+int main() { return 0; }
+
diff --git a/gcc/testsuite/g++.dg/parse/pr26997.C b/gcc/testsuite/g++.dg/parse/pr26997.C
new file mode 100644
index 000000000..acd1e07be
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr26997.C
@@ -0,0 +1,50 @@
+// PR c++/26997
+// { dg-do compile }
+void * malloc (unsigned long size);
+typedef struct { int a; } t;
+
+void foo()
+{
+ t *v3;
+ v3 = (t *)
+ malloc(
+ sizeof(t)
+ *
+ t->a // { dg-error "before '->' token" }
+ );
+}
+
+class C {
+public:
+ void operator[](int);
+};
+
+C bar (void)
+{
+ (C ())(3); // { dg-error "invalid cast" }
+ return (C ());
+}
+
+extern void baz (C,C);
+
+void foo1 (void)
+{
+ baz ((C()), (C()));
+}
+
+struct S {
+ void operator()(int);
+};
+
+int *var;
+void foo2 (void)
+{
+ C ()[2];
+ (C ())[2];
+ (S ())(3); // { dg-error "invalid cast" }
+ (C())*var; // { dg-error "invalid cast" }
+ (C())+var; // { dg-error "invalid cast" }
+ S()(3);
+ (S()(3));
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/pr37862.C b/gcc/testsuite/g++.dg/parse/pr37862.C
new file mode 100644
index 000000000..89b4b6994
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr37862.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+#include <stdlib.h>
+
+class A {
+public:
+ virtual void get (void) { }
+};
+
+class B : public A {
+public:
+ void get (void) { abort (); }
+};
+
+class C : public B { };
+
+int main (void)
+{
+ C c;
+ C * p = &c;
+
+ p->A::get ();
+ (p->A::get) (); // The C++ parser used to resolve this to B::get()
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/pr56239.C b/gcc/testsuite/g++.dg/parse/pr56239.C
new file mode 100644
index 000000000..08f7f6889
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr56239.C
@@ -0,0 +1,13 @@
+// PR c++/56239
+// { dg-do compile }
+
+struct S
+{
+ int operator () () { return 0; }
+};
+
+int
+main ()
+{
+ return (S ()) ();
+}
diff --git a/gcc/testsuite/g++.dg/parse/pragma1.C b/gcc/testsuite/g++.dg/parse/pragma1.C
new file mode 100644
index 000000000..88a56aafb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pragma1.C
@@ -0,0 +1,8 @@
+// PR c++/17916
+
+class T {
+#pragma X
+ struct S {
+ };
+#pragma Y
+};
diff --git a/gcc/testsuite/g++.dg/parse/pragma2.C b/gcc/testsuite/g++.dg/parse/pragma2.C
new file mode 100644
index 000000000..c5616ff74
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pragma2.C
@@ -0,0 +1,8 @@
+// PR c++/17595
+
+// Ideally, the #pragma error would come one line further down, but it
+// does not.
+int f(int x,
+#pragma interface // { dg-error "not allowed here" }
+ // The parser gets confused and issues an error on the next line.
+ int y); // { dg-bogus "" "" { xfail *-*-* } }
diff --git a/gcc/testsuite/g++.dg/parse/pragma3.C b/gcc/testsuite/g++.dg/parse/pragma3.C
new file mode 100644
index 000000000..36d7a8c62
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pragma3.C
@@ -0,0 +1,26 @@
+// PR c++/25294
+// { dg-do run }
+
+extern "C" void abort (void);
+
+struct S
+{
+ char a[3];
+#pragma pack(1) /* A block comment
+ that ends on the next line. */
+ struct T
+ {
+ char b;
+ int c;
+ } d;
+#pragma pack /*/ */ () // C++ comment
+ int e;
+} s;
+
+int
+main ()
+{
+ if (sizeof (int) == 4 && sizeof (s) != 12)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/primary-expression-1.C b/gcc/testsuite/g++.dg/parse/primary-expression-1.C
new file mode 100644
index 000000000..931ecd88a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/primary-expression-1.C
@@ -0,0 +1,58 @@
+// Copyright (C) 2002 Free Software Foundation
+// Origin: C++/717
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net
+// { dg-do compile }
+
+class _eAny
+{
+public:
+ _eAny(){}
+};
+
+template <class X>
+class _eSeq
+{
+public:
+ _eSeq(const X thing){}
+ int _oHash() {return 0;}
+ _eSeq<X > _oPlusPlus(const _eSeq<X > other) const
+ {
+ return *this;
+ }
+ _eSeq<X > take(const _eSeq<X > other) const
+ {
+ return *this;
+ }
+};
+
+
+template <class X>
+class _eHndl
+{
+public:
+ _eHndl(const _eAny *obj){}
+};
+
+class VarInstances : public _eAny
+{
+public:
+ VarInstances() : _eAny() {}
+};
+
+void testFunc(const VarInstances *testInstance)
+{
+ const _eSeq<_eHndl<VarInstances> > temp1 =
+ _eSeq<_eHndl<VarInstances> >(_eHndl<VarInstances>(testInstance));
+
+ if((_eSeq<_eHndl<VarInstances>
+ >(_eHndl<VarInstances>(testInstance))._oPlusPlus(temp1)._oHash() ==
+ 7))
+ {
+ return;
+ }
+}
+
+int main(int argc, char** argv)
+{
+ testFunc(new VarInstances());
+}
diff --git a/gcc/testsuite/g++.dg/parse/ptrmem1.C b/gcc/testsuite/g++.dg/parse/ptrmem1.C
new file mode 100644
index 000000000..b1174c7d9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ptrmem1.C
@@ -0,0 +1,10 @@
+struct A {
+ void f(int = 0) const;
+};
+
+typedef void (A::*PF)(int) const;
+
+void f()
+{
+ PF pf = &A::f;
+}
diff --git a/gcc/testsuite/g++.dg/parse/ptrmem2.C b/gcc/testsuite/g++.dg/parse/ptrmem2.C
new file mode 100644
index 000000000..bbc116e99
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ptrmem2.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18782: ICE with ptr-to-member
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+namespace A {}
+
+int A::* p; // { dg-error "is a namespace" "" }
diff --git a/gcc/testsuite/g++.dg/parse/ptrmem3.C b/gcc/testsuite/g++.dg/parse/ptrmem3.C
new file mode 100644
index 000000000..444f25cd2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ptrmem3.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com>
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// Bug 19895: ICE on invalid
+
+
+template<typename> struct A
+{
+ int A<0>::* p; // { dg-error "(type/value mismatch)|(expected)" "" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/ptrmem4.C b/gcc/testsuite/g++.dg/parse/ptrmem4.C
new file mode 100644
index 000000000..fea08f206
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ptrmem4.C
@@ -0,0 +1,4 @@
+// PR c++/26295
+
+namespace A {}
+int (A::*B)(); // { dg-error "namespace" }
diff --git a/gcc/testsuite/g++.dg/parse/ptrmem5.C b/gcc/testsuite/g++.dg/parse/ptrmem5.C
new file mode 100644
index 000000000..1101ad9fd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ptrmem5.C
@@ -0,0 +1,9 @@
+// PR c++/27806
+
+struct A {};
+
+void foo()
+{
+ p; // { dg-error "p" }
+ extern int A::* p;
+}
diff --git a/gcc/testsuite/g++.dg/parse/ptrmem6.C b/gcc/testsuite/g++.dg/parse/ptrmem6.C
new file mode 100644
index 000000000..6dac21cf9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ptrmem6.C
@@ -0,0 +1,11 @@
+//PR C++/27805
+
+struct A;
+
+void foo()
+{
+ int A::* p;
+ A a; // { dg-error "incomplete type" }
+ a.*p;
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/pure1.C b/gcc/testsuite/g++.dg/parse/pure1.C
new file mode 100644
index 000000000..2b6f28b7d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pure1.C
@@ -0,0 +1,11 @@
+// PR c++/28506
+
+struct A
+{
+ virtual void* foo() = 1; // { dg-error "pure" }
+};
+
+struct B
+{
+ void operator()()() = 1; // { dg-error "pure|function|initializer" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/qualified1.C b/gcc/testsuite/g++.dg/parse/qualified1.C
new file mode 100644
index 000000000..6dfb87e17
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/qualified1.C
@@ -0,0 +1,14 @@
+struct A {};
+
+struct B : public A
+{
+ static void foo ();
+};
+
+template <typename T> struct C
+{
+ C() : f(B::foo) {}
+ void (*f)();
+};
+
+C<int> c;
diff --git a/gcc/testsuite/g++.dg/parse/qualified2.C b/gcc/testsuite/g++.dg/parse/qualified2.C
new file mode 100644
index 000000000..c582613c9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/qualified2.C
@@ -0,0 +1,4 @@
+namespace Glib {
+ template <typename> class Value {};
+ template <> class Glib::Value<int> {}; // { dg-error "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/qualified3.C b/gcc/testsuite/g++.dg/parse/qualified3.C
new file mode 100644
index 000000000..ab160ab8d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/qualified3.C
@@ -0,0 +1,8 @@
+// PR c++/18466
+
+int ::i; // { dg-error "" }
+void ::f(); // { dg-error "" }
+namespace N {
+ int N::j; // { dg-error "" }
+ void N::g(); // { dg-error "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/qualified4.C b/gcc/testsuite/g++.dg/parse/qualified4.C
new file mode 100644
index 000000000..c827fcfe7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/qualified4.C
@@ -0,0 +1,6 @@
+// PR c++/16782
+// { dg-options "" }
+
+struct X {
+ void X::bar() {} // { dg-error "" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/redef1.C b/gcc/testsuite/g++.dg/parse/redef1.C
new file mode 100644
index 000000000..0235ffb72
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/redef1.C
@@ -0,0 +1,10 @@
+// { dg-options "" }
+// PR c++/16193
+
+# 1 "syshdr1.C"
+# 1 "syshdr1.h" 1 3
+// Redefinitions of built-in types are allowed in system headers so
+// that G++ will work with system headers that are not fully
+// C++-aware.
+typedef long wchar_t;
+# 2 "syshdr1.C" 2
diff --git a/gcc/testsuite/g++.dg/parse/redef2.C b/gcc/testsuite/g++.dg/parse/redef2.C
new file mode 100644
index 000000000..2435672d1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/redef2.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+char * d [10]; // { dg-error "8: 'd' has a previous declaration as" }
+char e [15][10];
+int (*f)();
+
+int d; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/ref1.C b/gcc/testsuite/g++.dg/parse/ref1.C
new file mode 100644
index 000000000..d1dffb067
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ref1.C
@@ -0,0 +1,17 @@
+// PR c++/6402
+// Origin: Wolfgang Bangerth <wolfgang@dealii.org>
+// { dg-do compile }
+
+class A
+{
+ A (const A&);
+ public:
+ A();
+};
+
+struct B { A a; };
+
+struct C : public B
+{
+ void foo() { const A &ref = B::a; } // taking reference, not a copy!
+};
diff --git a/gcc/testsuite/g++.dg/parse/register1.C b/gcc/testsuite/g++.dg/parse/register1.C
new file mode 100644
index 000000000..3be2e6525
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/register1.C
@@ -0,0 +1,14 @@
+// PR c++/23839
+
+class C
+{
+ int i;
+public:
+ C(int j) : i(j) { }
+ operator int() { return i; }
+};
+
+C f (register C x)
+{
+ return x + 31;
+}
diff --git a/gcc/testsuite/g++.dg/parse/repo1.C b/gcc/testsuite/g++.dg/parse/repo1.C
new file mode 100644
index 000000000..efadd5872
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/repo1.C
@@ -0,0 +1,10 @@
+// { dg-options "-frepo" }
+// { dg-require-host-local "" }
+
+extern "C" inline void f() {}
+
+int main () {
+ f();
+}
+
+// { dg-final { cleanup-repo-files } }
diff --git a/gcc/testsuite/g++.dg/parse/ret-type1.C b/gcc/testsuite/g++.dg/parse/ret-type1.C
new file mode 100644
index 000000000..a5dc93ab0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ret-type1.C
@@ -0,0 +1,10 @@
+// PR c++/2738
+// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de>
+// { dg-do compile }
+
+template <int i> class A
+{
+ class C { C(); };
+};
+
+template <int i> void A<i>::C::C () {} // { dg-error "return type" }
diff --git a/gcc/testsuite/g++.dg/parse/ret-type2.C b/gcc/testsuite/g++.dg/parse/ret-type2.C
new file mode 100644
index 000000000..35638c28a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ret-type2.C
@@ -0,0 +1,10 @@
+struct S {} f(); // { dg-error "return" "err" }
+// { dg-message "note" "note" { target *-*-* } 1 }
+struct T {} *g(); // { dg-error "return" }
+// { dg-message "note" "note" { target *-*-* } 3 }
+struct U {} h() {} // { dg-error "return" }
+// { dg-message "note" "note" { target *-*-* } 5 }
+struct V {} *i() {} // { dg-error "return" }
+// { dg-message "note" "note" { target *-*-* } 7 }
+struct W {} (*p) (); // { dg-error "return" }
+// { dg-message "note" "note" { target *-*-* } 9 }
diff --git a/gcc/testsuite/g++.dg/parse/ret-type3.C b/gcc/testsuite/g++.dg/parse/ret-type3.C
new file mode 100644
index 000000000..33ee31748
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ret-type3.C
@@ -0,0 +1,8 @@
+// PR c++/21369
+
+struct bar;
+
+template <class T> struct bar *foo (T *p)
+{
+ return p->t;
+}
diff --git a/gcc/testsuite/g++.dg/parse/saved1.C b/gcc/testsuite/g++.dg/parse/saved1.C
new file mode 100644
index 000000000..f7281088f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/saved1.C
@@ -0,0 +1,6 @@
+// Test that the parser doesn't go into an infinite loop from ignoring the
+// PRE_PARSED_FUNCTION_DECL token.
+
+class C { static void* operator new(size_t); }; // { dg-error "" "" }
+void* C::operator new(size_t) { return 0; } // { dg-error "" "" }
+class D { D(int i): integer(i){}}; // { dg-error "" "" }
diff --git a/gcc/testsuite/g++.dg/parse/semicolon1.C b/gcc/testsuite/g++.dg/parse/semicolon1.C
new file mode 100644
index 000000000..22c1e86e2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/semicolon1.C
@@ -0,0 +1,4 @@
+// PR c++/12479
+// { dg-options "-pedantic" }
+
+#include "semicolon1.h"
diff --git a/gcc/testsuite/g++.dg/parse/semicolon1.h b/gcc/testsuite/g++.dg/parse/semicolon1.h
new file mode 100644
index 000000000..0487fc783
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/semicolon1.h
@@ -0,0 +1,2 @@
+#pragma GCC system_header
+;
diff --git a/gcc/testsuite/g++.dg/parse/semicolon2.C b/gcc/testsuite/g++.dg/parse/semicolon2.C
new file mode 100644
index 000000000..d14a225a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/semicolon2.C
@@ -0,0 +1,9 @@
+// PR c++/45332
+// { dg-do compile }
+
+class C
+{
+ int x // { dg-error "at end of member declaration" }
+
+ const int foo() { return x; }
+};
diff --git a/gcc/testsuite/g++.dg/parse/semicolon3.C b/gcc/testsuite/g++.dg/parse/semicolon3.C
new file mode 100644
index 000000000..8a2b1ac46
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/semicolon3.C
@@ -0,0 +1,260 @@
+// PR c++/45331
+// { dg-do compile }
+// { dg-options -std=c++98 }
+
+struct OK1
+{
+ int a;
+} // no complaints
+ *s5;
+
+struct OK2
+{
+ int a;
+} // no complaints
+ &s6 = *(new OK2());
+
+struct OK3
+{
+ int a;
+} // no complaints
+ (s7);
+
+__SIZE_TYPE__
+test_offsetof (void)
+{
+ // no complaints about a missing semicolon
+ return __builtin_offsetof (struct OK4 { int a; int b; }, b);
+}
+
+struct OK5
+{
+ int a;
+} ok5_var; // no complaints
+
+struct OK6
+{
+ int a;
+} static ok6_var; // no complaints
+
+class OK7
+{
+public:
+ OK7() { };
+ int a;
+} const ok7_var; // no complaints
+
+class OK8
+{
+ int a;
+} extern ok8_var; // no complaints
+
+class OK9
+{
+ class OK9sub { int a; } mutable ok9sub; // no complaints
+ int a;
+};
+
+int
+autotest (void)
+{
+ struct OK10 { int a; } auto ok10 = { 0 }; // no complaints
+
+ return ok10.a;
+}
+
+struct OK11
+{
+ int a;
+} // no complaints
+ const *ok11_var;
+
+struct OK12
+{
+ int a;
+} // no complaints
+ const &ok12_var = *(new OK12());
+
+struct OK13
+{
+ int a;
+} // no complaints
+ static *ok13_var;
+
+class OK14
+{
+ struct OK14sub
+ {
+ int a;
+ } // no complaints
+ static &ok14_var;
+};
+
+class OK15
+{
+ int a;
+} typedef tOK15;
+
+class OK16
+{
+ int a;
+} typedef *pOK16;
+
+class OK17
+{
+ int a;
+} typedef &rOK16;
+
+struct E1
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+typedef float BAR;
+
+struct E2
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+const int i0 = 1;
+
+struct E3
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+volatile long l0 = 1;
+
+struct E4
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+extern char c0;
+
+struct E5
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+static wchar_t wc0;
+
+struct E6
+{
+ int a;
+} // { dg-error "after struct definition" }
+
+bool b0;
+
+class E7
+{
+ int a;
+} // { dg-error "after class definition" }
+
+extern double d0;
+
+class E8
+{
+ int a;
+} // { dg-error "after class definition" }
+
+inline short f(void)
+{
+ return 2;
+}
+
+class E9
+{
+ int a;
+} // { dg-error "after class definition" }
+
+class D0
+{
+ int a;
+};
+
+class E10
+{
+ int a;
+} // { dg-error "after class definition" }
+
+extern class D0 &f0 (void);
+
+class E11
+{
+ int a;
+} // { dg-error "after class definition" }
+
+const struct E6 *f1 (void) { return 0; }
+
+union U0 {
+ int i;
+ double d;
+};
+
+class E12
+{
+ int a;
+} // { dg-error "after class definition" }
+
+const union U0 *f2 (void) { return 0; }
+
+enum e {
+ U, V
+};
+
+class E13
+{
+ int a;
+} // { dg-error "after class definition" }
+
+static enum e f3 (void) { return U; }
+
+union E14
+{
+ int i;
+ double d;
+} // { dg-error "after union definition" }
+
+unsigned int i1 = 2;
+
+union E15
+{
+ int i;
+ double d;
+} // { dg-error "after union definition" }
+
+signed long l1 = 3;
+
+class E16
+{
+ class sub0 { int a; } // { dg-error "after class definition" }
+ virtual int f2 (void);
+} // { dg-error "after class definition" }
+
+class E17
+{
+ class sub0 { int a; } // { dg-error "after class definition" }
+ mutable int i;
+} // { dg-error "after class definition" }
+
+class E18
+{
+ int a;
+} // { dg-error "after class definition" }
+
+typedef int E18int;
+
+/* This was the original test from the PR. */
+
+class C0
+{
+public:
+ int a;
+} // { dg-error "after class definition" }
+
+const int foo(const C0 &x)
+{
+ return x.a;
+}
diff --git a/gcc/testsuite/g++.dg/parse/semicolon4.C b/gcc/testsuite/g++.dg/parse/semicolon4.C
new file mode 100644
index 000000000..adba7a873
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/semicolon4.C
@@ -0,0 +1,37 @@
+// PR c++/46890
+// { dg-do compile }
+
+struct OK1
+{
+ int i;
+} const *ok1_var; // No complains
+
+struct OK2;
+extern OK2 ok2a_var;
+
+struct OK2
+{
+ int i;
+} const &ok2_var = ok2a_var; // No complains
+
+struct OK3
+{
+ int i;
+} volatile (ok3_var); // No complains
+
+struct E1
+{
+ int i;
+} const; // { dg-error "qualifiers can only be specified for objects and functions" }
+
+void foo (
+struct E2
+{ // { dg-error "types may not be defined in parameter types" }
+ int i;
+} volatile);
+
+void bar (
+struct E3
+{ // { dg-error "types may not be defined in parameter types" }
+ int i;
+} const, int);
diff --git a/gcc/testsuite/g++.dg/parse/specialization1.C b/gcc/testsuite/g++.dg/parse/specialization1.C
new file mode 100644
index 000000000..8a47f1772
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/specialization1.C
@@ -0,0 +1,7 @@
+// PR c++/5723, PR c++/8522
+// Origin: Matthias Kleinmann, Peter Karl Mueller <peter.karl.mueller@gmx.de>
+// { dg-do compile }
+
+template <typename T> class A;
+template <typename T> class A<T>::B; // { dg-error "declaration" "err" }
+// { dg-warning "declaration" "warn" { target *-*-* } 6 }
diff --git a/gcc/testsuite/g++.dg/parse/stack1.C b/gcc/testsuite/g++.dg/parse/stack1.C
new file mode 100644
index 000000000..ac26e6006
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/stack1.C
@@ -0,0 +1,14 @@
+/* PR c/2161: parser stack overflow. */
+/* { dg-do compile } */
+
+#define ONE else if (0) { }
+#define TEN ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE
+#define HUN TEN TEN TEN TEN TEN TEN TEN TEN TEN TEN
+#define THOU HUN HUN HUN HUN HUN HUN HUN HUN HUN HUN
+
+void foo()
+{
+ if (0) { }
+ /* 11,000 else if's. */
+ THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU
+}
diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr1.C b/gcc/testsuite/g++.dg/parse/stmtexpr1.C
new file mode 100644
index 000000000..4455398bc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/stmtexpr1.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "" }
+
+int
+main (int argc, char **argv)
+{
+ int a = ({ 1 ? 0 : 1; });
+ return ({ argc > 1 ? 1 : 0; });
+}
diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr2.C b/gcc/testsuite/g++.dg/parse/stmtexpr2.C
new file mode 100644
index 000000000..44f7f85bc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/stmtexpr2.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "" }
+
+#define DMAX(a,b) ({double _a = (a), _b = (b); _a > _b ? _a : _b; })
+
+void foo(void)
+{
+ double xl, dy;
+ xl = DMAX(dy, 0.0);
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr3.C b/gcc/testsuite/g++.dg/parse/stmtexpr3.C
new file mode 100644
index 000000000..79f689316
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/stmtexpr3.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// { dg-options "" }
+
+struct B
+{
+ int a;
+ B() : a(({ 1; })) {}
+};
diff --git a/gcc/testsuite/g++.dg/parse/struct-1.C b/gcc/testsuite/g++.dg/parse/struct-1.C
new file mode 100644
index 000000000..6e0d93aad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/struct-1.C
@@ -0,0 +1,4 @@
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// PR c++/18731
+
+template<typename T> struct T::A {}; // { dg-error "invalid class name" }
diff --git a/gcc/testsuite/g++.dg/parse/struct-2.C b/gcc/testsuite/g++.dg/parse/struct-2.C
new file mode 100644
index 000000000..b63045bf9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/struct-2.C
@@ -0,0 +1,7 @@
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// PR c++/18731
+
+template<typename T> struct A
+{
+ struct T::B {}; // { dg-error "invalid class name" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/struct-3.C b/gcc/testsuite/g++.dg/parse/struct-3.C
new file mode 100644
index 000000000..8e73ce4f0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/struct-3.C
@@ -0,0 +1,10 @@
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// PR c++/18731
+
+struct A
+{
+ struct B;
+ typedef B C;
+};
+
+struct A::C {}; // { dg-error "invalid class name" }
diff --git a/gcc/testsuite/g++.dg/parse/struct-4.C b/gcc/testsuite/g++.dg/parse/struct-4.C
new file mode 100644
index 000000000..6d01f3e88
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/struct-4.C
@@ -0,0 +1,13 @@
+/* PR c/35437 */
+/* { dg-do compile } */
+
+struct A
+{
+ int i;
+ struct A a; /* { dg-error "has incomplete type" } */
+};
+
+void foo()
+{
+ struct A b = { 0 };
+}
diff --git a/gcc/testsuite/g++.dg/parse/struct-as-enum1.C b/gcc/testsuite/g++.dg/parse/struct-as-enum1.C
new file mode 100644
index 000000000..f58c73881
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/struct-as-enum1.C
@@ -0,0 +1,10 @@
+// PR c++/163, PR c++/8595
+// Origin: <martin@loewis.home.cs.tu-berlin.de>, Mark Leone <mleone@pixar.com>
+// { dg-do compile }
+
+namespace N
+{
+ struct A {}; // { dg-error "previous declaration" }
+}
+
+typedef enum N::A B; // { dg-error "enum|invalid type" }
diff --git a/gcc/testsuite/g++.dg/parse/template1.C b/gcc/testsuite/g++.dg/parse/template1.C
new file mode 100644
index 000000000..d7bbb073f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template1.C
@@ -0,0 +1,11 @@
+struct CPU {
+ typedef int (*pfun)();
+
+ template <pfun step1>
+ static int dispatch();
+};
+
+template<int>
+static int foo();
+
+template int CPU::dispatch<&template foo<2> > (); // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/template10.C b/gcc/testsuite/g++.dg/parse/template10.C
new file mode 100644
index 000000000..d5dec6ed1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template10.C
@@ -0,0 +1,15 @@
+// PR c++/9486
+// Origin: John Levon <levon@movementarian.org>
+// { dg-do compile }
+
+template <typename> struct A
+{
+ template <typename T> void foo(T);
+};
+
+template <typename T> void bar()
+{
+ A<void>().template foo<T>(0);
+}
+
+template void bar<int>();
diff --git a/gcc/testsuite/g++.dg/parse/template11.C b/gcc/testsuite/g++.dg/parse/template11.C
new file mode 100644
index 000000000..e651a3bd0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template11.C
@@ -0,0 +1,15 @@
+// PR c++/9488
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+struct A
+{
+ template <typename> void foo() {}
+};
+
+template <typename T> struct B
+{
+ void bar() { A().foo<T>(); }
+};
+
+template struct B<int>;
diff --git a/gcc/testsuite/g++.dg/parse/template12.C b/gcc/testsuite/g++.dg/parse/template12.C
new file mode 100644
index 000000000..ba375bc43
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template12.C
@@ -0,0 +1,10 @@
+template <int J>
+struct A {
+};
+
+struct B {
+ template <int I>
+ struct C : public A<I> {};
+
+ typedef double I;
+};
diff --git a/gcc/testsuite/g++.dg/parse/template13.C b/gcc/testsuite/g++.dg/parse/template13.C
new file mode 100644
index 000000000..b1c03690b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template13.C
@@ -0,0 +1,10 @@
+// PR c++/14002
+
+template <typename T> void foo (T x) { x; }
+
+void bar() { foo(0); }
+
+struct A
+{
+ friend void foo<int> (int);
+};
diff --git a/gcc/testsuite/g++.dg/parse/template14.C b/gcc/testsuite/g++.dg/parse/template14.C
new file mode 100644
index 000000000..ada875243
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template14.C
@@ -0,0 +1,17 @@
+// PR c++/14550
+
+struct A {
+ A();
+};
+
+template <int> void foo()
+{
+ A *p = new A;
+}
+
+void bar()
+{
+ foo<0>();
+}
+
+
diff --git a/gcc/testsuite/g++.dg/parse/template15.C b/gcc/testsuite/g++.dg/parse/template15.C
new file mode 100644
index 000000000..ce2d13036
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template15.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// Contributed by: Peter Schmid
+// <schmid at snake dot iap dot physik dot tu-darmstadt dot de>
+// PR c++/14545: constructor calls are not integer constant expressions
+
+struct A1 { A1(); };
+struct A2 { };
+
+template <class T>
+struct B
+{
+ void foo() {
+ A1();
+ A1 a1 = A1();
+
+ A2();
+ A2 a2 = A2();
+
+ int();
+ int a3 = int();
+ float();
+ float a4 = float();
+ }
+};
+
+template struct B<void>;
diff --git a/gcc/testsuite/g++.dg/parse/template16.C b/gcc/testsuite/g++.dg/parse/template16.C
new file mode 100644
index 000000000..bc41b0f45
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template16.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 May 2005 <nathan@codesourcery.com>
+
+// Origin:Volker Reichelt reichelt@gcc.gnu.org
+// PR 21681. ICE with inappropriate access check.
+
+template<int X> struct A;
+
+struct B
+{
+ template<int N> void foo()
+ {
+ A<N>::X::Y;
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/template17.C b/gcc/testsuite/g++.dg/parse/template17.C
new file mode 100644
index 000000000..ade598d39
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template17.C
@@ -0,0 +1,13 @@
+// PR c++/23841
+
+template <int I>
+struct S
+{
+ int f(int i = I) { return i; }
+};
+
+void
+g ()
+{
+ S<(int)0.> a2;
+}
diff --git a/gcc/testsuite/g++.dg/parse/template18.C b/gcc/testsuite/g++.dg/parse/template18.C
new file mode 100644
index 000000000..98209b244
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template18.C
@@ -0,0 +1,52 @@
+// PR c++/22173
+
+struct A
+{
+ static void a1();
+ template <typename T>
+ static void b1(T);
+ template <int I>
+ struct B {
+ static void b1();
+ template <typename T>
+ static void b2(T);
+ };
+ struct C {
+ static void c1();
+ };
+};
+
+template<int I> void f1()
+{
+ A* p;
+ A::template a1(); // { dg-error "template" }
+ A::template b1(0);
+ p->template a1(); // { dg-error "template" }
+ p->template b1('a');
+
+ A::template B<0>::b1();
+ A::template B<0>::template b1(); // { dg-error "template" }
+ A::template B<0>::template b2(0);
+ A::template B<0>::template b2<double>(0);
+
+ // Because B<I> is dependent, none of these are errors, as this
+ // function is not instantiated.
+ A::template B<I>::b1();
+ A::template B<I>::template b1();
+ A::template B<I>::template b2(0);
+ A::template B<I>::template b2<double>(0);
+
+ A::template C::c1(); // { dg-error "template" }
+}
+
+template<int I> void f2()
+{
+ // These are copies of lines from f1, but this function is
+ // instantiated, so we should get errors here.
+ A::template B<I>::b1();
+ A::template B<I>::template b1(); // { dg-error "template" }
+ A::template B<I>::template b2(0);
+ A::template B<I>::template b2<double>(0);
+}
+
+template void f2<0>(); // { dg-message "instantiated" }
diff --git a/gcc/testsuite/g++.dg/parse/template19.C b/gcc/testsuite/g++.dg/parse/template19.C
new file mode 100644
index 000000000..dc1a67334
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template19.C
@@ -0,0 +1,11 @@
+// PR c++/26558
+// Origin: Jan Gorski <slimak@yk74.internetdsl.tpnet.pl>
+// { dg-do compile }
+
+template<int> struct A
+{
+ template<int> void foo()
+ {
+ foo<0>::; // { dg-error "before" }
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/template2.C b/gcc/testsuite/g++.dg/parse/template2.C
new file mode 100644
index 000000000..6689c8bfa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template2.C
@@ -0,0 +1,7 @@
+namespace N {
+ template < typename T > class C : T {};
+}
+
+int main() {
+ N::C(); // { dg-error "template" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/template20.C b/gcc/testsuite/g++.dg/parse/template20.C
new file mode 100644
index 000000000..2705f4629
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template20.C
@@ -0,0 +1,7 @@
+// PR c++/28858
+// { dg-do compile }
+
+template<int N struct A; // { dg-error "before" }
+
+bool i = 1 > 0; // { dg-bogus "" }
+int j = i; // { dg-bogus "" }
diff --git a/gcc/testsuite/g++.dg/parse/template21.C b/gcc/testsuite/g++.dg/parse/template21.C
new file mode 100644
index 000000000..e1ac76916
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template21.C
@@ -0,0 +1,5 @@
+// PR c++/28211
+
+template <const int*> class Helper { };
+const int foo = 0;
+typedef Helper<&foo> HelperType; // { dg-error "linkage|type" }
diff --git a/gcc/testsuite/g++.dg/parse/template22.C b/gcc/testsuite/g++.dg/parse/template22.C
new file mode 100644
index 000000000..c93375685
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template22.C
@@ -0,0 +1,5 @@
+/* PR c++/29731. This used to ICE in uses_template_parms. */
+
+template<int> struct A {};
+
+A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */
diff --git a/gcc/testsuite/g++.dg/parse/template23.C b/gcc/testsuite/g++.dg/parse/template23.C
new file mode 100644
index 000000000..893d78d15
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template23.C
@@ -0,0 +1,10 @@
+/* PR c++/30895 This used to ICE. */
+/* { dg-do compile } */
+
+template<int> struct A {};
+
+template<typename T> struct B
+{
+ A<T(0i)> a1; /* { dg-error "imaginary constants are a GCC extension" } */
+ A<T(0i)> a2; /* { dg-error "imaginary constants are a GCC extension" } */
+};
diff --git a/gcc/testsuite/g++.dg/parse/template24.C b/gcc/testsuite/g++.dg/parse/template24.C
new file mode 100644
index 000000000..33d9d4cfd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template24.C
@@ -0,0 +1,8 @@
+/* PR c++/29731. This used to ICE in uses_template_parms. */
+
+template<int> struct A {};
+
+void foo()
+{
+ A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/template25.C b/gcc/testsuite/g++.dg/parse/template25.C
new file mode 100644
index 000000000..8ffcd121e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template25.C
@@ -0,0 +1,14 @@
+// PR c++/22318. Improve diagnostic for local template declaration.
+// { dg-do compile }
+void f(void)
+{
+ template<typename T> class A /* { dg-error "a template declaration cannot appear at block scope" } */
+ {
+ };
+}
+
+void g(void)
+{
+ template f<int>(); /* { dg-error "expected primary-expression" } */
+ /* { dg-error "expected ';'" "" { target *-*-* } 12 } */
+}
diff --git a/gcc/testsuite/g++.dg/parse/template3.C b/gcc/testsuite/g++.dg/parse/template3.C
new file mode 100644
index 000000000..d10d46d81
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template3.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Jan 2003 <nathan@codesourcery.com>
+
+// PR 9403. We failed to parse template keyword, and we accepted code
+// which required one.
+
+template<bool> struct Outer;
+
+template <bool b, typename T>
+struct X : Outer<b>::template Inner<T>
+{};
+
+template <bool b, typename T>
+struct Y : Outer<b>::Inner<T> {}; // { dg-error "used as template" "temp" }
+// { dg-error "expected" "exp" { target *-*-* } 16 }
+// { dg-message "note" "note" { target *-*-* } 16 }
+
diff --git a/gcc/testsuite/g++.dg/parse/template4.C b/gcc/testsuite/g++.dg/parse/template4.C
new file mode 100644
index 000000000..11f11d535
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template4.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 32 Jan 2003 <nathan@codesourcery.com>
+
+// PR 795. fields are not necessarily a dependent type.
+
+struct V
+{
+ template<typename T> T get ();
+};
+
+struct L
+{
+ V v;
+
+ template<typename T> T at (int i)
+ {
+ return v.get<T> ();
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/template5.C b/gcc/testsuite/g++.dg/parse/template5.C
new file mode 100644
index 000000000..adc598672
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template5.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 28 Jan 2003 <nathan@codesourcery.com>
+
+// PR 3902. More type/decl confusion.
+
+template <class T>
+struct S
+{
+ S foo (T (T));
+ S foo (T(const T&));
+};
+
+int main ()
+{
+ S<int> (S<int>::*pf1)(int (int)) = &S<int>::foo;
+ S<int> (S<int>::*pf2)(int (const int&)) = &S<int>::foo;
+}
diff --git a/gcc/testsuite/g++.dg/parse/template6.C b/gcc/testsuite/g++.dg/parse/template6.C
new file mode 100644
index 000000000..a83c313d0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template6.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Wolfgang Bangerth <bangerth@ticam.utexas.edu> 20 Feb 2003.
+
+// PR c++/9778. Ensure templated functions in other namespaces are
+// correctly instantiated.
+
+namespace NS {
+ template <int N> void foo ();
+}
+
+template <int N> struct X {
+ int m;
+ void g () {
+ NS::foo<sizeof(m)>();
+ }
+};
+
+template class X<2>;
diff --git a/gcc/testsuite/g++.dg/parse/template7.C b/gcc/testsuite/g++.dg/parse/template7.C
new file mode 100644
index 000000000..0d3f3fa24
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template7.C
@@ -0,0 +1,5 @@
+template <int I>
+void f(); // { dg-message "note" }
+
+void g() { f<(3, 2)>(); } // { dg-error "" }
+// { dg-message "candidate" "candidate note" { target *-*-* } 4 }
diff --git a/gcc/testsuite/g++.dg/parse/template8.C b/gcc/testsuite/g++.dg/parse/template8.C
new file mode 100644
index 000000000..e4af7eea3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template8.C
@@ -0,0 +1,16 @@
+namespace N
+{
+
+template <typename> struct A
+{
+ template <typename T> A(A<T>);
+};
+
+}
+
+void foo(N::A<int>);
+
+void bar()
+{
+ foo(N::A); // { dg-error "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/template9.C b/gcc/testsuite/g++.dg/parse/template9.C
new file mode 100644
index 000000000..17b7da91f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template9.C
@@ -0,0 +1,6 @@
+template <typename T>
+void f() {
+ g(); // { dg-error "must be available" "err" }
+ // { dg-message "note" "note" { target *-*-* } 3 }
+ h(3); // { dg-error "must be available" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/tmpl-outside1.C b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C
new file mode 100644
index 000000000..e63e3cd44
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C
@@ -0,0 +1,10 @@
+// PR c++/3792
+// Origin: <david.abrahams@rcn.com>
+// { dg-do compile }
+
+struct X
+{
+ template <int i> struct Y {};
+};
+
+typedef X::template Y<0> y; // { dg-error "template|invalid" }
diff --git a/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C
new file mode 100644
index 000000000..dcf2852d1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C
@@ -0,0 +1,20 @@
+// PR c++/8857
+// Origin: Martin v. Loewis <loewis@informatik.hu-berlin.de>
+// { dg-do compile }
+
+template <typename T> struct A
+{
+ template <typename U> operator U() { return sizeof(U); }
+};
+
+template <typename T> struct B
+{
+ template <template <typename U> class X> operator X<double>() { return X<double>(); }
+};
+
+int main()
+{
+ A<double> a;
+ B<long> b;
+ a = b;
+}
diff --git a/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C
new file mode 100644
index 000000000..1fec1af42
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C
@@ -0,0 +1,14 @@
+// PR c++/7259
+// Origin: Philipp Buettgenbach <P.Buettgenbach@FH-Wolfenbuettel.DE>
+// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template <template <int> class T> class A : public T<0> {};
+
+template <typename> struct B
+{
+ template <int> class C {};
+ typedef A<C> D;
+};
+
+B<void>::D d;
diff --git a/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C b/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C
new file mode 100644
index 000000000..4d98e7546
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C
@@ -0,0 +1,11 @@
+// PR c++/9229
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <typename T> class A // { dg-error "" }
+{
+ struct B;
+ template <typename U> friend typename A<U,void>::B foo(); // { dg-error "" }
+};
+
+template class A<int>;
diff --git a/gcc/testsuite/g++.dg/parse/try-catch-1.C b/gcc/testsuite/g++.dg/parse/try-catch-1.C
new file mode 100644
index 000000000..e4ed1ad8e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/try-catch-1.C
@@ -0,0 +1,14 @@
+// Test case from: <ncm-nospam@cantrip.org>
+// Reduced by <bangerth@dealii.org>
+// The problem was that g++ was ICE because
+// it was deferring an NULL pointer because
+// it should have been taking the operand 1
+// instead of the chain in finish_fname_decls.
+
+
+void fun()
+try
+{
+ __FUNCTION__;
+}
+catch (...) {}
diff --git a/gcc/testsuite/g++.dg/parse/typedef1.C b/gcc/testsuite/g++.dg/parse/typedef1.C
new file mode 100644
index 000000000..c4fbb950c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typedef1.C
@@ -0,0 +1,3 @@
+// PR c++/6477
+typedef struct A_ *A; // { dg-error "previous declaration" }
+typedef struct A B; // { dg-error "typedef|invalid type" }
diff --git a/gcc/testsuite/g++.dg/parse/typedef2.C b/gcc/testsuite/g++.dg/parse/typedef2.C
new file mode 100644
index 000000000..3ae347d75
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typedef2.C
@@ -0,0 +1,3 @@
+template <typename T> struct B { typedef typename T::X X; };
+template <typename T> struct A { typedef B<T>::X::Y Z; }; // { dg-error "" }
+
diff --git a/gcc/testsuite/g++.dg/parse/typedef3.C b/gcc/testsuite/g++.dg/parse/typedef3.C
new file mode 100644
index 000000000..6b4e531b6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typedef3.C
@@ -0,0 +1,7 @@
+// PR c++/3004
+// Origin: Travis J.I. Corcoran <tjic@permabit.com>
+// { dg-do compile }
+
+struct A { typedef A* Ptr; }; // { dg-error "previous declaration" }
+
+struct A::Ptr; // { dg-error "typedef|not declare anything" }
diff --git a/gcc/testsuite/g++.dg/parse/typedef4.C b/gcc/testsuite/g++.dg/parse/typedef4.C
new file mode 100644
index 000000000..8599fd1d8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typedef4.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Matt Austern <austern@apple.com>
+
+// PR c++/7983: ICE typedef to typename as friend.
+
+template<class T> class smart_ptr2 {
+ T* real_ptr;
+ public:
+ typedef typename T::subT td; // { dg-error "previous declaration" }
+ friend class td; // { dg-error "typedef|not name a class" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/typedef5.C b/gcc/testsuite/g++.dg/parse/typedef5.C
new file mode 100644
index 000000000..7079f3713
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typedef5.C
@@ -0,0 +1,6 @@
+namespace A
+{
+ typedef int T; // { dg-error "previous declaration" }
+}
+
+class A::T x; // { dg-error "using typedef-name|invalid type" }
diff --git a/gcc/testsuite/g++.dg/parse/typedef6.C b/gcc/testsuite/g++.dg/parse/typedef6.C
new file mode 100644
index 000000000..d3a39fc85
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typedef6.C
@@ -0,0 +1,6 @@
+// PR c++/14667
+
+template<class T>
+class Class1;
+
+class Class2 {} typedef Class1<Class2> Type1; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/typedef7.C b/gcc/testsuite/g++.dg/parse/typedef7.C
new file mode 100644
index 000000000..126fb7ed8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typedef7.C
@@ -0,0 +1,2 @@
+// PR c++/18285
+typedef void int char void double X; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/typedef8.C b/gcc/testsuite/g++.dg/parse/typedef8.C
new file mode 100644
index 000000000..6ff26febb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typedef8.C
@@ -0,0 +1,11 @@
+//PR c++ 29024
+
+typedef static int a; // { dg-error "conflicting" }
+typedef register int b; // { dg-error "conflicting" }
+typedef extern int c; // { dg-error "conflicting" }
+static typedef int a; // { dg-error "conflicting" }
+
+int foo()
+{
+ typedef auto int bar; // { dg-error "conflicting" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/typedef9.C b/gcc/testsuite/g++.dg/parse/typedef9.C
new file mode 100644
index 000000000..7788f781f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typedef9.C
@@ -0,0 +1,8 @@
+// PR c++/38794
+// { dg-do compile }
+
+typedef void foo () {} // { dg-error "invalid function declaration" }
+struct S
+{
+ typedef int bar (void) { return 0; } // { dg-error "invalid member function declaration" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/typename1.C b/gcc/testsuite/g++.dg/parse/typename1.C
new file mode 100644
index 000000000..2af84e3d7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename1.C
@@ -0,0 +1,5 @@
+template <class baz>
+struct bar
+{
+ typedef typename baz::typename rebind<int> foo; // { dg-error "" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/typename10.C b/gcc/testsuite/g++.dg/parse/typename10.C
new file mode 100644
index 000000000..64d6ae8c2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename10.C
@@ -0,0 +1,8 @@
+// PR c++/19253
+
+namespace N { struct X; }
+
+template<typename> struct A
+{
+ A<typename N::X x> a; // { dg-error "invalid" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/typename11.C b/gcc/testsuite/g++.dg/parse/typename11.C
new file mode 100644
index 000000000..a79e6d887
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename11.C
@@ -0,0 +1,16 @@
+// PR c++/11987
+
+template <int dim> struct X {
+ struct I { I(); };
+};
+
+template <int dim> struct Y : X<dim> {
+ typedef typename X<dim>::I I;
+};
+
+// note: I is nested type in X, not Y!
+template <int dim>
+Y<dim>::I::I () {} // { dg-error "dependent typedef" }
+// { dg-error "no type|dependent type" "" { target *-*-* } 13 }
+
+template struct Y<1>;
diff --git a/gcc/testsuite/g++.dg/parse/typename2.C b/gcc/testsuite/g++.dg/parse/typename2.C
new file mode 100644
index 000000000..8878497ad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename2.C
@@ -0,0 +1,17 @@
+template<class T, class U>
+struct UnaryReturn {
+ typedef T Type_t;
+};
+
+struct foo
+{
+ template <class T>
+ typename UnaryReturn<T, int>::Type_t
+ bar();
+};
+
+template<class T>
+struct UnaryReturn<T, int> {
+ typedef bool Type_t;
+};
+
diff --git a/gcc/testsuite/g++.dg/parse/typename3.C b/gcc/testsuite/g++.dg/parse/typename3.C
new file mode 100644
index 000000000..ce6ecbef8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename3.C
@@ -0,0 +1,8 @@
+template <typename T>
+struct D2 : public T::B {
+ typedef typename T::X::Y Y;
+
+ void f () {
+ Y::f ();
+ }
+};
diff --git a/gcc/testsuite/g++.dg/parse/typename4.C b/gcc/testsuite/g++.dg/parse/typename4.C
new file mode 100644
index 000000000..529889df6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename4.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+// Origin: Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>
+
+// PR c++/9364: ICE processing typename with name error.
+
+void find(typename int&); // { dg-error "typename|void|expected" }
diff --git a/gcc/testsuite/g++.dg/parse/typename5.C b/gcc/testsuite/g++.dg/parse/typename5.C
new file mode 100644
index 000000000..36647519f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename5.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/10553: ICE processing typename with context error.
+
+template <typename> struct A {};
+
+template <typename> struct B
+{
+ typedef A<typename X::Y> C; // { dg-error "declared|invalid|no type|expected" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/typename6.C b/gcc/testsuite/g++.dg/parse/typename6.C
new file mode 100644
index 000000000..dc458bee5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename6.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// Contributed by Matt Austern <austern at apple dot com>
+// PR c++/13407: Gracefully handle keyword typename in base class specifier.
+
+struct A { };
+struct B { typedef A Type; };
+
+template <typename T>
+struct X :
+ public typename T::Type // { dg-error "not allowed in this context" }
+{ };
+
+X<B> x;
+
+struct C :
+ public typename A // { dg-error "not allowed outside of templates" }
+{ };
diff --git a/gcc/testsuite/g++.dg/parse/typename7.C b/gcc/testsuite/g++.dg/parse/typename7.C
new file mode 100644
index 000000000..2d823f807
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename7.C
@@ -0,0 +1,33 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> and
+// Alexandre Oliva <aoliva@redhat.com>
+
+// PR c++/18757: ICE in get_innermost_template_args
+
+struct A
+{
+ template<typename> void foo(int); // { dg-message "note" }
+ template<typename T> void bar(T t) { // { dg-message "note" }
+ this->foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 12 }
+ template<typename T> void bad(T t) {
+ foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
+};
+
+template <typename T>
+struct B
+{
+ void bar(T t) {
+ A().bar<typename T>(t); } // { dg-error "expected|parse error|no matching" }
+ // { dg-message "candidate" "candidate note" { target *-*-* } 22 }
+ void bad(T t) {
+ B<typename T>::bar(t); } // { dg-error "invalid|not a template" }
+};
+
+void baz()
+{
+ A().bar(0);
+ A().bad(0);
+ B<int>().bar(0);
+}
diff --git a/gcc/testsuite/g++.dg/parse/typename8.C b/gcc/testsuite/g++.dg/parse/typename8.C
new file mode 100644
index 000000000..e8e762709
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename8.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Oct 2005 <nathan@codesourcery.com>
+
+// PR 23797:ICE
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// { dg-options "-fpermissive -w" }
+
+struct A { typedef int X; };
+
+int i = typename A::X();
diff --git a/gcc/testsuite/g++.dg/parse/typename9.C b/gcc/testsuite/g++.dg/parse/typename9.C
new file mode 100644
index 000000000..8d7707219
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename9.C
@@ -0,0 +1,6 @@
+// check that using a qualified name with a typename does
+// not report an error.
+
+struct A { typedef int X; };
+
+int i = typename A::X();
diff --git a/gcc/testsuite/g++.dg/parse/typespec1.C b/gcc/testsuite/g++.dg/parse/typespec1.C
new file mode 100644
index 000000000..44ee116f6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typespec1.C
@@ -0,0 +1,4 @@
+// PR c++/26571
+
+struct A {};
+unsigned A a; // { dg-error "expected initializer" }
diff --git a/gcc/testsuite/g++.dg/parse/undefined1.C b/gcc/testsuite/g++.dg/parse/undefined1.C
new file mode 100644
index 000000000..0ae4e8877
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/undefined1.C
@@ -0,0 +1,10 @@
+// PR c++/8143
+// { dg-do compile }
+
+struct foo
+{
+ X x; // { dg-error "" }
+
+ foo(X) {} // { dg-error "" }
+ foo(X y, int) : x() {} // { dg-error "" }
+};
diff --git a/gcc/testsuite/g++.dg/parse/undefined2.C b/gcc/testsuite/g++.dg/parse/undefined2.C
new file mode 100644
index 000000000..a7e76f1b7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/undefined2.C
@@ -0,0 +1,12 @@
+// PR c++/9173
+// Origin: <wwieser@gmx.de>
+// { dg-do compile }
+
+class A {};
+
+class B
+{
+ void foo(int,A::X); // { dg-error "" }
+};
+
+void B::foo(int,A::X) {} // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/undefined3.C b/gcc/testsuite/g++.dg/parse/undefined3.C
new file mode 100644
index 000000000..6bafd6fc6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/undefined3.C
@@ -0,0 +1,6 @@
+// PR c++/5657
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template<typename T> struct A { A(B); };
+template<typename T> A<T>::A(B) {} // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/undefined4.C b/gcc/testsuite/g++.dg/parse/undefined4.C
new file mode 100644
index 000000000..0bdc188d6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/undefined4.C
@@ -0,0 +1,11 @@
+// PR c++/5665
+// Origin: Bergur Ragnarsson <bergur@tern.is>
+// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+template<typename T> class A
+{
+ class B { X foo(); }; // { dg-error "" }
+};
+
+template<typename T> X A<T>::B::foo() {} // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/undefined5.C b/gcc/testsuite/g++.dg/parse/undefined5.C
new file mode 100644
index 000000000..f1dba6e48
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/undefined5.C
@@ -0,0 +1,5 @@
+// PR c++/5975
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+typedef typename X::Y<> y; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/undefined6.C b/gcc/testsuite/g++.dg/parse/undefined6.C
new file mode 100644
index 000000000..bc8a86d15
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/undefined6.C
@@ -0,0 +1,6 @@
+// PR c++/8596
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <int i> struct A {};
+template <int i> struct B : A<x>{}; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/undefined7.C b/gcc/testsuite/g++.dg/parse/undefined7.C
new file mode 100644
index 000000000..1a525fc65
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/undefined7.C
@@ -0,0 +1,5 @@
+// PR c++/9228
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+// { dg-do compile }
+
+template <typename T> typename A<T>::B foo() {} // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/using1.C b/gcc/testsuite/g++.dg/parse/using1.C
new file mode 100644
index 000000000..efe7a0e31
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/using1.C
@@ -0,0 +1 @@
+namespace A { using ::B; } // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/using2.C b/gcc/testsuite/g++.dg/parse/using2.C
new file mode 100644
index 000000000..bfdb09f88
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/using2.C
@@ -0,0 +1,8 @@
+namespace N {
+ template <typename T>
+ struct foo {};
+}
+
+int main() {
+ using N::foo<double>; // { dg-error "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/using3.C b/gcc/testsuite/g++.dg/parse/using3.C
new file mode 100644
index 000000000..c266b68ea
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/using3.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Sep 2003 <nathan@codesourcery.com>
+// Origin: stefaandr@hotmail.com
+
+// PR c++/11794. Using decl in nested classes of a template class
+
+template <typename T> struct a
+{
+ struct a1: T
+ {
+ using T::aa;
+
+ a1() { aa = 5; }
+ };
+};
+struct b { int aa; };
+template <> struct a<int>::a1 { a1 () {} };
+
+a<b>::a1 a_b;
+a<int>::a1 a_i;
diff --git a/gcc/testsuite/g++.dg/parse/varmod1.C b/gcc/testsuite/g++.dg/parse/varmod1.C
new file mode 100644
index 000000000..d64f04b78
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/varmod1.C
@@ -0,0 +1,7 @@
+int main(int argc, char** argv) {
+ int nx = 2;
+ void theerror(double a[][nx+1]); // { dg-message "" }
+ double** a;
+ theerror(a);
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/wrong-inline1.C b/gcc/testsuite/g++.dg/parse/wrong-inline1.C
new file mode 100644
index 000000000..22b9a9768
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/wrong-inline1.C
@@ -0,0 +1,12 @@
+// PR c++/5921
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+struct A
+{
+ struct B { B(); };
+};
+
+static A::B b;
+
+inline template <int i> void f (); // { dg-error "" }