]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/17011, c++/17971
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Sat, 4 Dec 2004 06:55:00 +0000 (06:55 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Sat, 4 Dec 2004 06:55:00 +0000 (06:55 +0000)
PR c++/17011, c++/17971
* pt.c (tsubst_copy) <FIELD_DECL case>: Check and diagnose
invalid field.
(tsubst_copy_and_build) <COMPONENT_REF case>: Check
error_mark_node after member substitution.
* semantics.c (finish_id_expression): Call
finish_non_static_data_member for dependent FIELD_DECL.

* g++.dg/template/error15.C: Adjust expected error.
* g++.dg/template/instantiate3.C: Likewise.

From-SVN: r91721

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/error15.C
gcc/testsuite/g++.dg/template/instantiate3.C

index 4eafeb675795ff52b9f097ecba1905a3b7245476..74da1964be933e7e29d24c9acec88116c71ee99d 100644 (file)
@@ -1,3 +1,13 @@
+2004-12-04  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/17011, c++/17971
+       * pt.c (tsubst_copy) <FIELD_DECL case>: Check and diagnose
+       invalid field.
+       (tsubst_copy_and_build) <COMPONENT_REF case>: Check
+       error_mark_node after member substitution.
+       * semantics.c (finish_id_expression): Call
+       finish_non_static_data_member for dependent FIELD_DECL.
+
 2004-12-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/18123
index 4462b8599f0ae8ae87eb0fa23e36a135b744f62c..95d03c7f39f6b45e51a66c764eb63ec903b8ab49 100644 (file)
@@ -7519,7 +7519,16 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
          ctx = tsubst_aggr_type (DECL_CONTEXT (t), args, complain, in_decl,
                                  /*entering_scope=*/1);
          if (ctx != DECL_CONTEXT (t))
-           return lookup_field (ctx, DECL_NAME (t), 0, false);
+           {
+             tree r = lookup_field (ctx, DECL_NAME (t), 0, false);
+             if (!r)
+               {
+                 if (complain & tf_error)
+                   error ("using invalid field `%D'", t);
+                 return error_mark_node;
+               }
+             return r;
+           }
        }
       return t;
 
@@ -8548,7 +8557,9 @@ tsubst_copy_and_build (tree t,
        else
          member = tsubst_copy (member, args, complain, in_decl);
 
-       if (!CLASS_TYPE_P (TREE_TYPE (object)))
+       if (member == error_mark_node)
+         return error_mark_node;
+       else if (!CLASS_TYPE_P (TREE_TYPE (object)))
          {
            if (TREE_CODE (member) == BIT_NOT_EXPR)
              return finish_pseudo_destructor_expr (object, 
index f41e50374ba67486972bf606f32bd1a5344dbd2e..cf207102749b5da4d4a4ae0ddb32c2ff90186400 100644 (file)
@@ -2558,6 +2558,12 @@ finish_id_expression (tree id_expression,
          if (TREE_CODE (decl) == VAR_DECL
              || TREE_CODE (decl) == PARM_DECL)
            return decl;
+         /* The same is true for FIELD_DECL, but we also need to
+            make sure that the syntax is correct.  */
+         else if (TREE_CODE (decl) == FIELD_DECL)
+           return finish_non_static_data_member
+                    (decl, current_class_ref,
+                     /*qualifying_scope=*/NULL_TREE);
          return id_expression;
        }
 
index 0fe9ae52cc275a356bf0aa1efd2f1f8bd88e52a3..f36371a813bdf3c342f04790e39b6b2df9faae6b 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-04  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/17011, c++/17971
+       * g++.dg/template/error15.C: Adjust expected error.
+       * g++.dg/template/instantiate3.C: Likewise.
+
 2004-12-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/18123
index 5a1a3227dda4a613b092caeb05eeb1a680401860..6bd1f77e874b392f057bd5c1cb4a39d0415f2519 100644 (file)
@@ -11,14 +11,14 @@ protected:
     
   A<T> a; // { dg-error "" }
     
-  void f(const A<T> * a1 = &a);
+  void f(const A<T> * a1 = &a); // { dg-error "this location" }
     
   void g(void);
 };
 
 template <class T>
 void B<T>::g(void) {
-  f(); // { dg-error "" }
+  f();
 }
 
-template class B<long>; // { dg-error "" }
+template class B<long>;
index 14dbcdac07958c0e49ce04156c7aa857c80b7131..4644fd02b550862ed7c249ad810e595a60b7752b 100644 (file)
@@ -10,7 +10,7 @@ template <class TYPE>
 struct ACE_Cleanup_Adapter
 {
   TYPE &object ()
-  { return object_; }  // { dg-error "undeclared|reported" }
+  { return object_; }  // { dg-error "invalid" }
   TYPE object_;                // { dg-error "incomplete type" }
 };