aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.old-deja/g++.jason/template26.C
diff options
context:
space:
mode:
authorBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
committerBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
commit1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch)
treec607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/g++.old-deja/g++.jason/template26.C
parent283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff)
downloadtoolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.old-deja/g++.jason/template26.C')
-rw-r--r--gcc-4.9/gcc/testsuite/g++.old-deja/g++.jason/template26.C115
1 files changed, 115 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.old-deja/g++.jason/template26.C b/gcc-4.9/gcc/testsuite/g++.old-deja/g++.jason/template26.C
new file mode 100644
index 000000000..e7e3762b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.old-deja/g++.jason/template26.C
@@ -0,0 +1,115 @@
+// { dg-do run }
+// PRMS Id: 6275
+// Bug: unification fails for call to find_parameter_in_stack.
+
+#include <stdio.h>
+#include <stdlib.h>
+
+const int max_stack_size = 20;
+
+template <class T>
+class Stack {
+ private:
+ T objects[max_stack_size];
+ int nobjects;
+ public:
+ Stack(): nobjects(0) {}
+ void push(const T&a) {
+ if (nobjects >= max_stack_size) {
+ fprintf(stderr,"Stack: overflow\n");
+ abort();
+ }
+ objects[nobjects++] = a;
+ }
+ T pop() {
+ if (!nobjects) {
+ fprintf(stderr,"Stack: underflow\n");
+ abort();
+ }
+ nobjects -= 1;
+ T result = objects[nobjects];
+ return result;
+ }
+ T top() const {
+ if (!nobjects) {
+ fprintf(stderr,"Stack: underflow\n");
+ abort();
+ }
+ return objects[nobjects - 1];
+ }
+ int n() const { return nobjects; }
+ T operator[](int i) { return objects[i]; }
+};
+
+template <class T>
+class Parameter {
+ T parameter_;
+ int is_set_;
+ int overrides_;
+ public:
+ Parameter(): is_set_(0), overrides_(0) {}
+ void set(const T& a) { parameter_ = a; is_set_ = 1; }
+ void override(int overrides = 1) { overrides_ = overrides; }
+ const T& value() const { return parameter_; }
+ int overrides() const { return overrides_; }
+ int is_set() const { return is_set_; }
+};
+
+template <class T1, class T2>
+T2
+find_parameter_in_stack(Stack<T1>& stack, Parameter<T2>& (T1::*access)())
+{
+ T2 result;
+ int have_result = 0;
+ for (int i=stack.n()-1; i>=0; i--) {
+ if ((stack[i].*access)().is_set()) {
+ if (!have_result || (stack[i].*access)().overrides()) {
+ result = (stack[i].*access)().value();
+ have_result = 1;
+ }
+ }
+ }
+ return result;
+}
+
+class A {
+ private:
+ Parameter<int> a_;
+ public:
+ A() { }
+ Parameter<int>& a() { return a_; }
+};
+
+int
+main(int, char**)
+{
+ Stack<A> A_stack;
+ A a1;
+ A a2;
+ a1.a().set(1);
+ a2.a().set(2);
+ A_stack.push(a1);
+ A_stack.push(a2);
+
+ int val = find_parameter_in_stack(A_stack, &A::a);
+
+ printf("val = %d\n", val);
+ if (val != 2)
+ return 1;
+
+ A_stack.pop();
+ A_stack.pop();
+
+ a1.a().override();
+
+ A_stack.push(a1);
+ A_stack.push(a2);
+
+ val = find_parameter_in_stack(A_stack, &A::a);
+
+ printf("val = %d\n", val);
+ if (val != 1)
+ return 1;
+
+ return 0;
+}