re PR c++/17221 (C++ offsetof regression)
authorRichard Henderson <rth@redhat.com>
Tue, 31 Aug 2004 17:39:56 +0000 (10:39 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 31 Aug 2004 17:39:56 +0000 (10:39 -0700)
        PR c++/17221
        * pt.c (tsubst_expr): Move OFFSETOF_EXPR handling ...
        (tsubst_copy_and_build): ... here.

From-SVN: r86835

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/template/offsetof1.C [new file with mode: 0644]

index eea871b4c82bed630e523b76a6bc604a2e88d5a6..2aaca7d43a2b1511ad246e48067201759ab78825 100644 (file)
@@ -1,3 +1,9 @@
+2004-08-31  Richard Henderson  <rth@redhat.com>
+
+       PR c++/17221
+       * pt.c (tsubst_expr): Move OFFSETOF_EXPR handling ...
+       (tsubst_copy_and_build): ... here.
+
 2004-08-30  Mark Mitchell  <mark@codesourcery.com>
 
        * cp-tree.h (initialize_artificial_var): Declare.
index d7335a06e6b69a248b2da03dbf7d31814ba19aab..18f15a890f38e25bc99e5b3f2665a61275dcaa7c 100644 (file)
@@ -8085,11 +8085,6 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
       tsubst (TREE_TYPE (t), args, complain, NULL_TREE);
       break;
 
-    case OFFSETOF_EXPR:
-      t = tsubst_copy_and_build (TREE_OPERAND (t, 0), args, complain,
-                                in_decl, false);
-      return fold_offsetof (t);
-
     default:
       gcc_assert (!STATEMENT_CODE_P (TREE_CODE (t)));
       
@@ -8630,6 +8625,9 @@ tsubst_copy_and_build (tree t,
                             tsubst_copy (TREE_TYPE (t), args, complain, 
                                          in_decl));
 
+    case OFFSETOF_EXPR:
+      return fold_offsetof (RECUR (TREE_OPERAND (t, 0)));
+
     default:
       return tsubst_copy (t, args, complain, in_decl);
     }
diff --git a/gcc/testsuite/g++.dg/template/offsetof1.C b/gcc/testsuite/g++.dg/template/offsetof1.C
new file mode 100644 (file)
index 0000000..1ee9be1
--- /dev/null
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// PR c++/17221
+
+#include <cstddef>
+
+template <int N> struct Bar;
+template <> struct Bar<3> {};
+
+template <class T>
+struct Foo {
+   Bar<offsetof(T, a) + 3> k;
+};
+
+struct A { int a; };
+
+template struct Foo<A>;