/*******************************************************************************
 * Copyright (c) 2007, 2015 Symbian Software Systems and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Andrew Ferguson (Symbian) - Initial implementation
 *     Markus Schorn (Wind River Systems)
 *     Sergey Prigogin (Google)
 *     Nathan Ridge
 *******************************************************************************/
package org.eclipse.cdt.internal.index.tests;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IProblemType;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.dom.ast.cpp.SemanticQueries;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.parser.IProblem;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.core.runtime.CoreException;

import junit.framework.TestSuite;

/**
 * For testing PDOM binding CPP language resolution
 */
/*
 * aftodo - once we have non-problem bindings working, each test should
 * additionally check that the binding obtained has characteristics as
 * expected (type,name,etc..)
 */
public abstract class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBase {

	public static class SingleProjectTest extends IndexCPPBindingResolutionTest {
		public SingleProjectTest() {
			setStrategy(new SinglePDOMTestStrategy(true));
		}

		public static TestSuite suite() {
			return suite(SingleProjectTest.class);
		}
	}

	public static class ProjectWithDepProjTest extends IndexCPPBindingResolutionTest {
		public ProjectWithDepProjTest() {
			setStrategy(new ReferencedProject(true));
		}

		public static TestSuite suite() {
			return suite(ProjectWithDepProjTest.class);
		}
	}

	public static void addTests(TestSuite suite) {
		suite.addTest(SingleProjectTest.suite());
		suite.addTest(ProjectWithDepProjTest.suite());
	}

	public IndexCPPBindingResolutionTest() {
		setStrategy(new SinglePDOMTestStrategy(true));
	}

	public static TestSuite suite() {
		return suite(SingleProjectTest.class);
	}

	/* Assertion helpers */
	/* ##################################################################### */

	static protected void assertField(IBinding binding, String qn, Class expType, String expTypeQN) {
		assertTrue(binding instanceof ICPPField);
		ICPPField field = (ICPPField) binding;
		assertQNEquals(qn, field);
		assertTrue(expType.isInstance(field.getType()));
		if (expTypeQN != null) {
			assert (field.getType() instanceof ICPPBinding);
			ICPPBinding tyBinding = (ICPPBinding) field.getType();
			assertQNEquals(expTypeQN, tyBinding);
		}
	}

	static protected void assertClassTypeBinding(IBinding binding, String qn, int key, int bases, int fields,
			int declaredFields, int methods, int declaredMethods, int allDeclaredMethods, int friends, int constructors,
			int nestedClasses) {
		assertTrue(binding instanceof ICPPClassType);
		assertClassType((ICPPClassType) binding, qn, key, bases, fields, declaredFields, methods, declaredMethods,
				allDeclaredMethods, friends, constructors, nestedClasses);
	}

	static protected void assertClassType(IType type, String qn, int key, int bases, int fields, int declaredFields,
			int methods, int declaredMethods, int allDeclaredMethods, int friends, int constructors,
			int nestedClasses) {
		assertTrue(type instanceof ICPPClassType);
		ICPPClassType classType = (ICPPClassType) type;
		assertQNEquals(qn, classType);
		assertEquals(key, classType.getKey());
		assertEquals(bases, classType.getBases().length);
		assertEquals(fields, classType.getFields().length);
		assertEquals(declaredFields, classType.getDeclaredFields().length);
		assertEquals(methods, classType.getMethods().length);
		assertEquals(declaredMethods, classType.getDeclaredMethods().length);
		assertEquals(allDeclaredMethods, classType.getAllDeclaredMethods().length);
		assertEquals(friends, classType.getFriends().length);
		assertEquals(constructors, classType.getConstructors().length);
		assertEquals(nestedClasses, classType.getNestedClasses().length);
	}

	public void assertEnumeration(IBinding binding, String name, String[] enumerators) throws DOMException {
		assertTrue(binding instanceof IEnumeration);
		assertEquals(name, binding.getName());
		IEnumerator[] aEnumerators = ((IEnumeration) binding).getEnumerators();
		Set expectedEnumerators = new HashSet();
		expectedEnumerators.addAll(Arrays.asList(enumerators));
		Set actualEnumerators = new HashSet();
		for (IEnumerator enumerator : aEnumerators) {
			actualEnumerators.add(enumerator.getName());
		}
		assertEquals(expectedEnumerators, actualEnumerators);
	}

	/**
	 * @param type
	 * @param cqn
	 * @param qn may be null
	 */
	static protected void assertPTM(IType type, String cqn, String qn) {
		assertTrue(type instanceof ICPPPointerToMemberType);
		ICPPPointerToMemberType ptmt = (ICPPPointerToMemberType) type;
		ICPPClassType classType = (ICPPClassType) ptmt.getMemberOfClass();
		assertQNEquals(cqn, classType);
		if (qn != null) {
			assert (ptmt.getType() instanceof ICPPBinding);
			ICPPBinding tyBinding = (ICPPBinding) ptmt.getType();
			assertQNEquals(qn, tyBinding);
		}
	}

	private void asserValueEquals(IValue initialValue, long i) {
		assertNotNull(initialValue);
		final Number numericalValue = initialValue.numberValue();
		assertNotNull(numericalValue);
		assertEquals(i, numericalValue.longValue());
	}

	private void assertUserDefinedLiteralType(String retName) {
		ICPPVariable v = getBindingFromFirstIdentifier("test =");
		assertEquals(retName, ASTTypeUtil.getType(v.getType()));
	}

	//	namespace ns { class A; enum E {E1}; typedef int T; }
	//
	//	class B {
	//    public:
	//	  void m(ns::A* a);
	//    void n(ns::E* a);
	// 	  void o(ns::T* a);
	//    void p(ns::E a);
	//	};

	//	namespace ns {
	//	  class A {};
	//    typedef int T;
	//	}
	//
	//	using ns::A;
	//	using ns::E;
	//	using ns::T;
	//  using ns::E1;
	//
	//	void B::m(A* a) {}
	//	void B::n(E* a) {}
	//	void B::o(T* a) {}
	//  void B::p(E a) {}
	//
	//  void usage() {
	//    B b;
	//    b.p(E1);
	//  }
	public void testUsingTypeDeclaration_201177() {
		IBinding b0 = getBindingFromASTName("B::m", 4);
		IBinding b1 = getBindingFromASTName("B::n", 4);
		IBinding b2 = getBindingFromASTName("B::o", 4);
		IBinding b3 = getBindingFromASTName("p(E1)", 1);
		assertInstance(b0, ICPPMethod.class);
		assertInstance(b1, ICPPMethod.class);
		assertInstance(b2, ICPPMethod.class);
	}

	// namespace n { class A{}; class B{}; class C{}; }

	// namespace m {
	//    using namespace n;
	//    class D{};
	// }
	// m::C c;
	// m::D d;
	public void testUsingNamingDirective_177917_1a() {
		IBinding b0 = getBindingFromASTName("C c", 1);
		IBinding b1 = getBindingFromASTName("D d", 1);
	}

	// namespace n { class A{}; }
	// namespace m {
	// using namespace n;
	//     class B {};
	// }

	// namespace n { class C{}; }
	// m::C c;
	public void testUsingNamingDirective_177917_1b() {
		IBinding b0 = getBindingFromFirstIdentifier("C c");
	}

	// int ff(int x) { return x; }
	// namespace n { class A {}; }
	// namespace m { class B {}; enum C{CE1,CE2}; }
	// namespace o { int (*f)(int)= ff; }

	// using n::A;
	// A a;
	// using namespace m;
	// B b;
	// C c= CE1;
	// using o::f;
	// int g(int x) {return 4;}
	// int g(char x) {return 2;}
	// int nn= g(f(2));
	public void testUsingTypeDeclaration_177917_1() {
		IBinding b1 = getBindingFromASTName("A a", 1);
		IBinding b2 = getBindingFromASTName("B b", 1);
		IBinding b3 = getBindingFromASTName("C c", 1);
		IBinding b4 = getBindingFromASTName("CE1", 3);
		IBinding b5 = getBindingFromASTName("f(2", 1);
	}

	// namespace a { class A {}; }
	// namespace b {
	//     using a::A;
	//     class B {};
	// }

	// b::A aa;
	// b::B bb;
	public void testUsingTypeDeclaration_177917_2() {
		IBinding b0 = getBindingFromASTName("A aa", 1);
		IBinding b1 = getBindingFromASTName("B bb", 1);
	}

	//	namespace header {
	//		class clh {
	//		};
	//		void fh();
	//		void fh(int a);
	//
	//		class cl {
	//		};
	//		void f();
	//		void f(int a);
	//	}
	//	using header::clh;
	//	using header::fh;

	//	namespace source {
	//		class cls {
	//		};
	//		void fs();
	//		void fs(int a);
	//
	//	}
	//	using header::cl;
	//	using header::f;
	//
	//
	//	using source::cls;
	//	using source::fs;
	//
	//	void test() {
	//		fh();
	//		fh(1);
	//
	//		clh c;
	//
	//		f();
	//		f(1);
	//		cl c1;
	//
	//		fs();
	//		fs(1);
	//		cls c2;
	//	}
	public void testUsingOverloadedFunctionDeclaration() {
		IBinding b;
		b = getBindingFromASTName("fh()", 2);
		b = getBindingFromASTName("fh(1)", 2);
		b = getBindingFromASTName("clh c", 3);
		b = getBindingFromASTName("f()", 1);
		b = getBindingFromASTName("f(1)", 1);
		b = getBindingFromASTName("cl c1", 2);
		b = getBindingFromASTName("fs()", 2);
		b = getBindingFromASTName("fs(1)", 2);
		b = getBindingFromASTName("cls c2", 3);
	}

	// int (*f)(int);
	// int g(int n){return n;}
	// int g(int n, int m){ return n+m; }

	// void foo() {
	//    f= g;
	// }
	public void testPointerToFunction() {
		IBinding b0 = getBindingFromASTName("f= g;", 1);
		IBinding b1 = getBindingFromASTName("g;", 1);

		assertInstance(b0, ICPPVariable.class);
		ICPPVariable v0 = (ICPPVariable) b0;
		assertInstance(v0.getType(), IPointerType.class);
		IPointerType p0 = (IPointerType) v0.getType();
		assertInstance(p0.getType(), ICPPFunctionType.class);
		ICPPFunctionType f0 = (ICPPFunctionType) p0.getType();
		assertInstance(f0.getReturnType(), ICPPBasicType.class);
		assertEquals(1, f0.getParameterTypes().length);
		assertInstance(f0.getParameterTypes()[0], ICPPBasicType.class);

		assertInstance(b1, ICPPFunction.class);
		ICPPFunctionType f1 = ((ICPPFunction) b1).getType();
		assertInstance(f1.getReturnType(), ICPPBasicType.class);
		assertEquals(1, f1.getParameterTypes().length);
		assertInstance(f1.getParameterTypes()[0], ICPPBasicType.class);
	}

	//  class Base {public: int field; void foo() {}};
	//	class C : public Base {
	//		public:
	//			struct CS { long* l; C *method(CS **); };
	//			CS cs;
	//			CS **cspp;
	//			long * CS::* ouch;
	//			long * CS::* autsch;
	//			C* (CS::*method)(CS **);
	//		};

	//  C *cp = new C(); /*b0, b1*/
	//	void references() {
	//		long l = 5, *lp;
	//		lp = &l;
	//		cp->cs.*cp->ouch = lp = cp->cs.*cp->autsch; /*b2, b3, b4*/
	//		&(cp->cs)->*cp->autsch = lp = &(cp->cs)->*cp->ouch;
	//		(cp->cs).method(cp->cspp);/*1*/ (&(cp->cs))->method(cp->cspp);/*2*/
	//		((cp->cs).*(cp->method))(cp->cspp);/*3*/
	//		((&(cp->cs))->*(cp->method))(cp->cspp);/*4*/
	//	}
	public void testPointerToMemberFields() throws IOException, DOMException {
		IBinding b0 = getBindingFromASTName("C *cp", 1);
		assertClassType((ICPPClassType) b0, "C", ICPPClassType.k_class, 1, 6, 5, 9, 0, 1, 0, 2, 1);

		IBinding b1 = getBindingFromASTName("cp = new C()", 2);
		assertVariable(b1, "cp", IPointerType.class, null);
		IPointerType b1type = (IPointerType) ((ICPPVariable) b1).getType();
		assertClassType(b1type.getType(), "C", ICPPClassType.k_class, 1, 6, 5, 9, 0, 1, 0, 2, 1);

		IBinding b2 = getBindingFromASTName("cs.*cp->o", 2);
		ICPPField field0 = (ICPPField) b2;
		assertTrue(field0.getType() instanceof ICPPClassType);

		IBinding b3 = getBindingFromASTName("ouch = lp", 4);
		assertField(b3, "C::ouch", ICPPPointerToMemberType.class, null);
		assertPTM(((ICPPField) b3).getType(), "C::CS", null);

		IBinding b4 = getBindingFromASTName("autsch;", 6);
		assertField(b4, "C::autsch", ICPPPointerToMemberType.class, null);
		assertPTM(((ICPPField) b4).getType(), "C::CS", null);

		IBinding b5 = getBindingFromASTName("cs)->*cp->a", 2);
		assertField(b5, "C::cs", ICPPClassType.class, "C::CS");
		assertClassType(((ICPPField) b5).getType(), "C::CS", ICompositeType.k_struct, 0, 1, 1, 5, 1, 1, 0, 2, 0);

		IBinding b6 = getBindingFromASTName("autsch = lp", 6);
		assertField(b4, "C::autsch", ICPPPointerToMemberType.class, null);
		assertPTM(((ICPPField) b4).getType(), "C::CS", null);

		IBinding b7 = getBindingFromASTName("ouch;", 4);
		assertField(b3, "C::ouch", ICPPPointerToMemberType.class, null);
		assertPTM(((ICPPField) b3).getType(), "C::CS", null);
	}

	// class C {}; struct S {}; union U {}; enum E {ER1,ER2,ER3};
	// int var1; C var2; S *var3; void func(E); void func(C);
	// namespace ns {}
	// typedef int Int; typedef int *IntPtr;
	// void func(int*); void func(int);

	// void references() {
	// 	C c; /*c*/ S s; /*s*/ U u; /*u*/ E e; /*e*/
	//  var1 = 1; /*var1*/ var2 = c; /*var2*/ var3 = &s; /*var3*/
	//  func(e); /*func1*/ func(var1); /*func2*/ func(c); /*func3*/
	//  Int a; /*a*/
	//  IntPtr b = &a; /*b*/
	//  func(*b); /*func4*/ func(a); /*func5*/
	// }
	// class C2 : public C {}; /*base*/
	// struct S2 : public S {}; /*base*/
	public void testSimpleGlobalBindings() throws IOException, DOMException {
		{
			IBinding b0 = getBindingFromASTName("C c; ", 1);
			assertClassTypeBinding(b0, "C", ICPPClassType.k_class, 0, 0, 0, 4, 0, 0, 0, 2, 0);

			IBinding b1 = getBindingFromASTName("c; ", 1);
			assertVariable(b1, "c", ICPPClassType.class, "C");
			ICPPClassType b1type = (ICPPClassType) ((ICPPVariable) b1).getType();
			assertClassTypeBinding(b1type, "C", ICPPClassType.k_class, 0, 0, 0, 4, 0, 0, 0, 2, 0);
			assertEquals(EScopeKind.eGlobal, b1type.getScope().getKind());
			assertTrue(b1type.getCompositeScope() instanceof ICPPClassScope);
			assertClassTypeBinding(((ICPPClassScope) b1type.getCompositeScope()).getClassType(), "C",
					ICPPClassType.k_class, 0, 0, 0, 4, 0, 0, 0, 2, 0);
		}
		{
			IBinding b2 = getBindingFromASTName("S s;", 1);
			assertClassTypeBinding(b2, "S", ICompositeType.k_struct, 0, 0, 0, 4, 0, 0, 0, 2, 0);

			IBinding b3 = getBindingFromASTName("s;", 1);
			assertVariable(b3, "s", ICPPClassType.class, "S");
			ICPPClassType b3type = (ICPPClassType) ((ICPPVariable) b3).getType();
			assertClassTypeBinding(b3type, "S", ICompositeType.k_struct, 0, 0, 0, 4, 0, 0, 0, 2, 0);
		}
		{
			IBinding b4 = getBindingFromASTName("U u;", 1);
			assertClassTypeBinding(b4, "U", ICompositeType.k_union, 0, 0, 0, 4, 0, 0, 0, 2, 0);

			IBinding b5 = getBindingFromASTName("u; ", 1);
			assertVariable(b5, "u", ICPPClassType.class, "U");
			ICPPClassType b5type = (ICPPClassType) ((ICPPVariable) b5).getType();
			assertClassTypeBinding(b5type, "U", ICompositeType.k_union, 0, 0, 0, 4, 0, 0, 0, 2, 0);
		}
		{
			IBinding b6 = getBindingFromASTName("E e; ", 1);
			assertEnumeration(b6, "E", new String[] { "ER1", "ER2", "ER3" });

			IBinding b7 = getBindingFromASTName("e; ", 1);
			assertVariable(b7, "e", IEnumeration.class, "E");
			IEnumeration b5type = (IEnumeration) ((ICPPVariable) b7).getType();
			assertEnumeration(b5type, "E", new String[] { "ER1", "ER2", "ER3" });
			assertEquals(EScopeKind.eGlobal, b5type.getScope().getKind());
		}
		{
			IBinding b8 = getBindingFromASTName("var1 = 1;", 4);
			assertVariable(b8, "var1", ICPPBasicType.class, null);
		}
		{
			IBinding b9 = getBindingFromASTName("var2 = c;", 4);
			assertVariable(b9, "var2", ICPPClassType.class, "C");
			ICPPClassType b9type = (ICPPClassType) ((ICPPVariable) b9).getType();
			assertClassTypeBinding(b9type, "C", ICPPClassType.k_class, 0, 0, 0, 4, 0, 0, 0, 2, 0);
		}
		{
			IBinding b10 = getBindingFromASTName("var3 = &s;", 4);
			assertVariable(b10, "var3", IPointerType.class, null);
			IPointerType b10type = (IPointerType) ((ICPPVariable) b10).getType();
			assertClassTypeBinding((ICPPClassType) b10type.getType(), "S", ICompositeType.k_struct, 0, 0, 0, 4, 0, 0, 0,
					2, 0);
		}
		{
			IBinding b11 = getBindingFromASTName("func(e);", 4);
		}
		IBinding b12 = getBindingFromASTName("func(var1);", 4);
		IBinding b13 = getBindingFromASTName("func(c);", 4);
		IBinding b14 = getBindingFromASTName("Int a; ", 3);
		IBinding b15 = getBindingFromASTName("a; ", 1);
		IBinding b16 = getBindingFromASTName("IntPtr b = &a; ", 6);
		IBinding b17 = getBindingFromASTName("b = &a; /*b*/", 1);
		IBinding b18 = getBindingFromASTName("func(*b);", 4);
		IBinding b19 = getBindingFromASTName("b); /*func4*/", 1);
		IBinding b20 = getBindingFromASTName("func(a);", 4);
		IBinding b21 = getBindingFromASTName("a); /*func5*/", 1);
		IBinding b22 = getBindingFromASTName("C2 : public", 2);
		IBinding b23 = getBindingFromASTName("C {}; /*base*/", 1);
		IBinding b24 = getBindingFromASTName("S2 : public", 2);
		IBinding b25 = getBindingFromASTName("S {}; /*base*/", 1);
	}

	//// header content
	//class TopC {}; struct TopS {}; union TopU {}; enum TopE {TopER1,TopER2};
	//short topBasic; void *topPtr; TopC *topCPtr; TopU topFunc(){return *new TopU();}

	//// referencing content
	//namespace n1 {
	//   class TopC {}; struct TopS {}; union TopU {}; enum TopE {TopER1,TopER2};
	//   short topBasic; void *topPtr;/*A*/ TopC *topCPtr;/*A*/ TopU topFunc(){return *new TopU();}
	//   class C {
	//      class TopC {}; struct TopS {}; union TopU {}; enum TopE {TopER1,TopER2};
	//      short topBasic; void *topPtr;/*B*/ TopC *topCPtr;/*B*/ TopU topFunc(){return *new TopU();}
	//      void references() {
	//         ::TopC c; ::TopS s; ::TopU u; ::TopE e = ::TopER1;
	//         ::topBasic++; ::topPtr = &::topBasic; ::topCPtr = &c; ::topFunc();
	//      }
	//   };
	//}
	public void testSingletonQualifiedName() {
		IBinding b0 = getBindingFromASTName("TopC c", 4);
		IBinding b1 = getBindingFromASTName("TopS s", 4);
		IBinding b2 = getBindingFromASTName("TopU u", 4);
		IBinding b3 = getBindingFromASTName("TopE e", 4);
		IBinding b4 = getBindingFromASTName("TopER1;", 6);
		IBinding b5 = getBindingFromASTName("topBasic++", 8);
		IBinding b6 = getBindingFromASTName("topPtr = &", 6);
		IBinding b7 = getBindingFromASTName("topBasic; ::", 8);
		IBinding b8 = getBindingFromASTName("topCPtr = &", 7);
		IBinding b9 = getBindingFromASTName("topFunc();", 7);

		IBinding _b5 = getBindingFromASTName("topBasic; v", 8);
		IBinding _b6 = getBindingFromASTName("topPtr;/*A*/", 6);
		IBinding _b7 = getBindingFromASTName("topPtr;/*B*/", 6);
		IBinding _b8 = getBindingFromASTName("topCPtr;/*A*/", 7);
		IBinding _b9 = getBindingFromASTName("topCPtr;/*B*/", 7);
		IBinding _b10 = getBindingFromASTName("topFunc(){", 7);
	}

	//	// header content
	// namespace n1 { namespace n2 { struct S {}; } }
	// class c1 { public: class c2 { public: struct S {}; }; };
	// struct s1 { struct s2 { struct S {}; }; };
	// union u1 { struct u2 { struct S {}; }; };
	// namespace n3 { class c3 { public: struct s3 { union u3 { struct S {}; }; }; }; }

	// // reference content
	// void reference() {
	//  ::n1::n2::S _s0; n1::n2::S _s1;
	//  ::c1::c2::S _s2; c1::c2::S _s3;
	//  ::s1::s2::S _s4; s1::s2::S _s5;
	//  ::u1::u2::S _s6; u1::u2::S _s7;
	//  ::n3::c3::s3::u3::S _s8;
	//    n3::c3::s3::u3::S _s9;
	// }
	// namespace n3 { c3::s3::u3::S _s10; }
	// namespace n1 { n2::S _s11; }
	// namespace n1 { namespace n2 { S _s12; }}
	public void testQualifiedNamesForStruct() throws DOMException {
		IBinding b0 = getBindingFromASTName("S _s0;", 1);
		assertTrue(b0.getScope() instanceof ICPPNamespaceScope);
		assertTrue(b0.getScope().getParent() instanceof ICPPNamespaceScope);
		assertEquals(EScopeKind.eGlobal, b0.getScope().getParent().getParent().getKind());
		assertQNEquals("n1::n2::S", b0);

		IBinding b1 = getBindingFromASTName("S _s1;", 1);
		assertTrue(b1.getScope() instanceof ICPPNamespaceScope);
		assertTrue(b1.getScope().getParent() instanceof ICPPNamespaceScope);
		assertEquals(EScopeKind.eGlobal, b1.getScope().getParent().getParent().getKind());
		assertQNEquals("n1::n2::S", b1);

		IBinding b2 = getBindingFromASTName("S _s2;", 1);
		assertTrue(b2.getScope() instanceof ICPPClassScope);
		assertTrue(b2.getScope().getParent() instanceof ICPPClassScope);
		assertEquals(EScopeKind.eGlobal, b2.getScope().getParent().getParent().getKind());
		assertQNEquals("c1::c2::S", b2);

		IBinding b3 = getBindingFromASTName("S _s3;", 1);
		assertQNEquals("c1::c2::S", b3);
		IBinding b4 = getBindingFromASTName("S _s4;", 1);
		assertQNEquals("s1::s2::S", b4);
		IBinding b5 = getBindingFromASTName("S _s5;", 1);
		assertQNEquals("s1::s2::S", b5);
		IBinding b6 = getBindingFromASTName("S _s6;", 1);
		assertQNEquals("u1::u2::S", b6);
		IBinding b7 = getBindingFromASTName("S _s7;", 1);
		assertQNEquals("u1::u2::S", b7);
		IBinding b8 = getBindingFromASTName("S _s8;", 1);
		assertQNEquals("n3::c3::s3::u3::S", b8);
		IBinding b9 = getBindingFromASTName("S _s9;", 1);
		assertQNEquals("n3::c3::s3::u3::S", b9);

		IBinding b10 = getBindingFromASTName("S _s10;", 1);
		assertTrue(b10.getScope() instanceof ICPPClassScope);
		assertTrue(b10.getScope().getParent() instanceof ICPPClassScope);
		assertTrue(b10.getScope().getParent().getParent() instanceof ICPPClassScope);
		assertTrue(b10.getScope().getParent().getParent().getParent() instanceof ICPPNamespaceScope);
		assertEquals(EScopeKind.eGlobal, b10.getScope().getParent().getParent().getParent().getParent().getKind());
		assertQNEquals("n3::c3::s3::u3::S", b10);

		IBinding b11 = getBindingFromASTName("S _s11;", 1);
		assertQNEquals("n1::n2::S", b11);
		IBinding b12 = getBindingFromASTName("S _s12;", 1);
		assertQNEquals("n1::n2::S", b12);
	}

	// // header content
	// namespace n1 { namespace n2 { union U {}; } }
	// class c1 { public: class c2 { public: union U {}; }; };
	// struct s1 { struct s2 { union U {}; }; };
	// union u1 { struct u2 { union U {}; }; };
	// namespace n3 { class c3 { public: struct s3 { union u3 { union U {}; }; }; }; }

	// // reference content
	// void reference() {
	//  ::n1::n2::U _u0; n1::n2::U _u1;
	//  ::c1::c2::U _u2; c1::c2::U _u3;
	//  ::s1::s2::U _u4; s1::s2::U _u5;
	//  ::u1::u2::U _u6; u1::u2::U _u7;
	//  ::n3::c3::s3::u3::U _u8;
	//    n3::c3::s3::u3::U _u9;
	// }
	// namespace n3 { c3::s3::u3::U _u10; }
	// namespace n1 { n2::U _u11; }
	// namespace n1 { namespace n2 { U _u12; }}
	public void testQualifiedNamesForUnion() throws DOMException {
		IBinding b0 = getBindingFromASTName("U _u0;", 1);
		assertQNEquals("n1::n2::U", b0);
		IBinding b1 = getBindingFromASTName("U _u1;", 1);
		assertQNEquals("n1::n2::U", b1);
		IBinding b2 = getBindingFromASTName("U _u2;", 1);
		assertQNEquals("c1::c2::U", b2);
		IBinding b3 = getBindingFromASTName("U _u3;", 1);
		assertQNEquals("c1::c2::U", b3);
		IBinding b4 = getBindingFromASTName("U _u4;", 1);
		assertQNEquals("s1::s2::U", b4);
		IBinding b5 = getBindingFromASTName("U _u5;", 1);
		assertQNEquals("s1::s2::U", b5);
		IBinding b6 = getBindingFromASTName("U _u6;", 1);
		assertQNEquals("u1::u2::U", b6);
		IBinding b7 = getBindingFromASTName("U _u7;", 1);
		assertQNEquals("u1::u2::U", b7);
		IBinding b8 = getBindingFromASTName("U _u8;", 1);
		assertQNEquals("n3::c3::s3::u3::U", b8);
		IBinding b9 = getBindingFromASTName("U _u9;", 1);
		assertQNEquals("n3::c3::s3::u3::U", b9);
		IBinding b10 = getBindingFromASTName("U _u10;", 1);
		assertQNEquals("n3::c3::s3::u3::U", b10);
		IBinding b11 = getBindingFromASTName("U _u11;", 1);
		assertQNEquals("n1::n2::U", b11);
		IBinding b12 = getBindingFromASTName("U _u12;", 1);
		assertQNEquals("n1::n2::U", b12);
	}

	//	struct A {
	//	  A& operator<<(int);
	//	  void p() &;
	//	  void p() &&;
	//	};
	//	A& operator<<(A&&, char);

	//	void test() {
	//	  A a;
	//	  A() << 1;//1     // calls A::operator<<(int)
	//	  A() << 'c';//2   // calls operator<<(A&&, char)
	//	  a << 1;//3       // calls A::operator<<(int)
	//	  a << 'c';//4     // calls A::operator<<(int)
	//	  A().p();//5      // calls A::p()&&
	//	  a.p();//6        // calls A::p()&
	//  }
	public void testRankingOfReferenceBindings() throws Exception {
		ICPPMethod m = getBindingFromImplicitASTName("<< 1;//1", 2);
		assertNotNull(m);
		assertEquals(1, m.getType().getParameterTypes().length);
		ICPPFunction f = getBindingFromImplicitASTName("<< 'c';//2", 2);
		assertNotNull(f);
		assertEquals(2, f.getType().getParameterTypes().length);
		m = getBindingFromImplicitASTName("<< 1;//3", 2);
		assertNotNull(m);
		assertEquals(1, m.getType().getParameterTypes().length);
		m = getBindingFromImplicitASTName("<< 'c';//4", 2);
		assertNotNull(m);
		assertEquals(1, m.getType().getParameterTypes().length);
		m = getBindingFromFirstIdentifier("p();//5");
		assertNotNull(m);
		assertTrue(m.getType().isRValueReference());
		m = getBindingFromFirstIdentifier("p();//6");
		assertNotNull(m);
		assertFalse(m.getType().isRValueReference());
	}

	// // header content
	// namespace n1 { namespace n2 { class C {}; } }
	// class c1 { public: class c2 { public: class C {}; }; };
	// struct s1 { struct s2 { class C {}; }; };
	// union u1 { union u2 { class C {}; }; };
	// namespace n3 { class c3 { public: struct s3 { union u3 { class C {}; }; }; }; }

	// // reference content
	// void reference() {
	//  ::n1::n2::C _c0; n1::n2::C _c1;
	//  ::c1::c2::C _c2; c1::c2::C _c3;
	//  ::s1::s2::C _c4; s1::s2::C _c5;
	//  ::u1::u2::C _c6; u1::u2::C _c7;
	//  ::n3::c3::s3::u3::C _c8;
	//    n3::c3::s3::u3::C _c9;
	// }
	// namespace n3 { c3::s3::u3::C _c10; }
	// namespace n1 { n2::C _c11; }
	// namespace n1 { namespace n2 { C _c12; }}
	public void testQualifiedNamesForClass() throws DOMException {
		IBinding b0 = getBindingFromASTName("C _c0;", 1);
		assertQNEquals("n1::n2::C", b0);
		IBinding b1 = getBindingFromASTName("C _c1;", 1);
		assertQNEquals("n1::n2::C", b1);
		IBinding b2 = getBindingFromASTName("C _c2;", 1);
		assertQNEquals("c1::c2::C", b2);
		IBinding b3 = getBindingFromASTName("C _c3;", 1);
		assertQNEquals("c1::c2::C", b3);
		IBinding b4 = getBindingFromASTName("C _c4;", 1);
		assertQNEquals("s1::s2::C", b4);
		IBinding b5 = getBindingFromASTName("C _c5;", 1);
		assertQNEquals("s1::s2::C", b5);
		IBinding b6 = getBindingFromASTName("C _c6;", 1);
		assertQNEquals("u1::u2::C", b6);
		IBinding b7 = getBindingFromASTName("C _c7;", 1);
		assertQNEquals("u1::u2::C", b7);
		IBinding b8 = getBindingFromASTName("C _c8;", 1);
		assertQNEquals("n3::c3::s3::u3::C", b8);
		IBinding b9 = getBindingFromASTName("C _c9;", 1);
		assertQNEquals("n3::c3::s3::u3::C", b9);
		IBinding b10 = getBindingFromASTName("C _c10;", 1);
		assertQNEquals("n3::c3::s3::u3::C", b10);
		IBinding b11 = getBindingFromASTName("C _c11;", 1);
		assertQNEquals("n1::n2::C", b11);
		IBinding b12 = getBindingFromASTName("C _c12;", 1);
		assertQNEquals("n1::n2::C", b12);
	}

	// // header content
	// namespace n1 { namespace n2 { typedef int Int; } }
	// class c1 { public: class c2 { public: typedef int Int; }; };
	// struct s1 { struct s2 { typedef int Int; }; };
	// union u1 { struct u2 { typedef int Int; }; };
	// namespace n3 { class c3 { public: struct s3 { union u3 { typedef int Int; }; }; }; }

	// // reference content
	// void reference() {
	//  ::n1::n2::Int i0; n1::n2::Int i1;
	//  ::c1::c2::Int i2; c1::c2::Int i3;
	//  ::s1::s2::Int i4; s1::s2::Int i5;
	//  ::u1::u2::Int i6; u1::u2::Int i7;
	//  ::n3::c3::s3::u3::Int i8;
	//    n3::c3::s3::u3::Int i9;
	// }
	// namespace n3 { c3::s3::u3::Int i10; }
	// namespace n1 { n2::Int i11; }
	// namespace n1 { namespace n2 { Int i12; }}
	public void testQualifiedNamesForTypedef() throws DOMException {
		IBinding b0 = getBindingFromASTName("Int i0;", 3);
		assertQNEquals("n1::n2::Int", b0);
		IBinding b1 = getBindingFromASTName("Int i1;", 3);
		assertQNEquals("n1::n2::Int", b1);

		IBinding b2 = getBindingFromASTName("Int i2;", 3);
		assertQNEquals("c1::c2::Int", b2);
		IBinding b3 = getBindingFromASTName("Int i3;", 3);
		assertQNEquals("c1::c2::Int", b3);

		IBinding b4 = getBindingFromASTName("Int i4;", 3);
		assertQNEquals("s1::s2::Int", b4);
		IBinding b5 = getBindingFromASTName("Int i5;", 3);
		assertQNEquals("s1::s2::Int", b5);

		IBinding b6 = getBindingFromASTName("Int i6;", 3);
		assertQNEquals("u1::u2::Int", b6);
		IBinding b7 = getBindingFromASTName("Int i7;", 3);
		assertQNEquals("u1::u2::Int", b7);

		IBinding b8 = getBindingFromASTName("Int i8;", 3);
		assertQNEquals("n3::c3::s3::u3::Int", b8);
		IBinding b9 = getBindingFromASTName("Int i9;", 3);
		assertQNEquals("n3::c3::s3::u3::Int", b9);
		IBinding b10 = getBindingFromASTName("Int i10;", 3);
		assertQNEquals("n3::c3::s3::u3::Int", b10);
		IBinding b11 = getBindingFromASTName("Int i11;", 3);
		assertQNEquals("n1::n2::Int", b11);
		IBinding b12 = getBindingFromASTName("Int i12;", 3);
		assertQNEquals("n1::n2::Int", b12);
	}

	//	struct A {
	//	  static struct {
	//	  } waldo;
	//	};
	//	decltype(A::waldo) A::waldo;

	//	A a;
	public void testDecltype_434150() {
		checkBindings();
	}

	// // header content
	// enum E { ER1, ER2 };

	// // referencing content
	// class C {
	//	 E e1;
	//	 static E e2;
	//	 void m1() { e1 = ER1; }
	//	 static void m2() { e2 = ER2; }
	// };
	public void testEnumeratorInClassScope() {
		IBinding b0 = getBindingFromASTName("E e1", 1);
		IBinding b1 = getBindingFromASTName("ER1; }", 3);
		IBinding b2 = getBindingFromASTName("ER2; }", 3);
	}

	// // header content
	// enum E { ER1, ER2 };

	// // referencing content
	// struct S {
	//	 E e1;
	//	 static E e2;
	//	 void m1() { e1 = ER1; }
	//	 static void m2() { e2 = ER2; }
	// };
	public void testEnumeratorInStructScope() {
		IBinding b0 = getBindingFromASTName("E e1", 1);
		IBinding b1 = getBindingFromASTName("ER1; }", 3);
		IBinding b2 = getBindingFromASTName("ER2; }", 3);
	}

	//	 // header content
	// enum E { ER1, ER2 };

	// // referencing content
	// union U {
	//	 E e1;
	//	 static E e2;
	//	 void m1() { e1 = ER1; }
	//	 static void m2() { e2 = ER2; }
	// };
	public void testEnumeratorInUnionScope() {
		IBinding b0 = getBindingFromASTName("E e1", 1);
		IBinding b1 = getBindingFromASTName("ER1; }", 3);
		IBinding b2 = getBindingFromASTName("ER2; }", 3);
	}

	//	 // header content
	// enum E { ER1, ER2 };

	// // referencing content
	// namespace n1 {
	//	 E e1;
	//	 static E e2;
	//	 void f1() { e1 = ER1; }
	//	 static void f2() { e2 = ER2; }
	// };
	public void testEnumeratorInNamespaceScope() {
		IBinding b0 = getBindingFromASTName("E e1", 1);
		IBinding b1 = getBindingFromASTName("ER1; }", 3);
		IBinding b2 = getBindingFromASTName("ER2; }", 3);
	}

	//	static union {
	//	    int a;
	//	    int b;
	//	};
	//	namespace N {
	//		static union {
	//			int c;
	//			int d;
	//		};
	//	}

	//	int waldo1 = a;
	//	int waldo2 = N::d;
	public void testAnonymousUnion_377409() {
		checkBindings();
	}

	// void foo(int a=2, int b=3);

	// void ref() { foo(); }
	public void testFunctionDefaultArguments() {
		IBinding b0 = getBindingFromASTName("foo();", 3);
	}

	// typedef int TYPE;
	// namespace ns {
	//    const TYPE* foo(int a);
	// };

	// const TYPE* ns::foo(int a) { return 0; }
	public void testTypeQualifier() {
		IBinding b0 = getBindingFromASTName("foo(", 3);
	}

	//	class Base { public: void foo(int i) {} };
	//	class Derived : public Base { public: void foo(long l) {} };

	// void references() {
	//    Derived d; /*d*/
	//    d.foo(55L); // calls long version
	//    d.foo(4); // also calls long version (int version is hidden)
	//    // aftodo - does this test make sense?
	// }
	public void testMethodHidingInInheritance() {
		IBinding b0 = getBindingFromASTName("d; /*d*/", 1);
		IBinding b1 = getBindingFromASTName("foo(55L);", 3);
		IBinding b2 = getBindingFromASTName("foo(4);", 3);
	}

	// namespace x { namespace y { int i; } }

	// class C { public:
	//    class x { public:
	//       class y { public:
	//          static int j;
	//       };
	//    };
	//    void method() {
	//       ::x::y::i++;
	//       x::y::j++;
	//    }
	// };
	public void testGQualifiedReference() {
		IBinding b0 = getBindingFromASTName("x::y::i++", 1);
		assertTrue(ICPPNamespace.class.isInstance(b0));
		IBinding b1 = getBindingFromASTName("y::i++", 1);
		assertTrue(ICPPNamespace.class.isInstance(b1));
		IBinding b2 = getBindingFromASTName("i++", 1);
		assertTrue(ICPPVariable.class.isInstance(b2));
		IBinding b3 = getBindingFromASTName("x::y::j++", 1);
		assertTrue(ICPPClassType.class.isInstance(b3));
		IBinding b4 = getBindingFromASTName("y::j++", 1);
		assertTrue(ICPPClassType.class.isInstance(b4));
		IBinding b5 = getBindingFromASTName("j++", 1);
		assertTrue(ICPPVariable.class.isInstance(b5));
	}

	////header content
	//struct S {int i;};
	//struct SS { S s, *sp; };
	//
	//S* retsptr() {return 0;}
	//S rets() { return *new S(); }
	//S s, *sp;
	//SS ss, *ssp;
	//S *a[3];

	////reference content
	//void references() {
	//	a[0]->i/*0*/++; (*a[0]).i/*1*/++;                    // IASTArraySubscriptExpression
	//	/* not applicable ?? */                              // IASTBinaryExpression
	//	((S*)sp)->i/*3*/++; ((S)s).i/*4*/++; //aftodo-valid? // IASTCastExpression
	//	(true ? sp : sp)->i/*5*/++; (true ? s : s).i/*6*/++; // IASTConditionalExpression
	//	(sp,sp)->i/*7*/++; (s,s).i/*8*/++;                   // IASTExpressionList
	//	ss.sp->i/*9*/++; ss.s.i/*10*/++;                     // IASTFieldReference
	//	ssp->sp->i/*11*/++; ssp->s.i/*12*/++;                // IASTFieldReference
	//	retsptr()->i/*13*/++; rets().i/*14*/++;              // IASTFunctionCallExpression
	//	sp->i/*15*/++; s.i/*16*/++;                          // IASTIdExpression
	//	/* not applicable */                                 // IASTLiteralExpression
	//	/* not applicable */                                 // IASTTypeIdExpression
	//	(*sp).i/*17*/++;                                     // IASTUnaryExpression
	//	/* not applicable */                                 // ICPPASTDeleteExpression
	//	(new S())->i/*18*/++;                                // ICPPASTNewExpression
	//}
	public void testFieldReference() {
		IBinding b0 = getBindingFromASTName("i/*0*/", 1);
		IBinding b1 = getBindingFromASTName("i/*1*/", 1);
		// IBinding b2 = getBindingFromASTName(ast, "i/*2*/", 1);
		IBinding b3 = getBindingFromASTName("i/*3*/", 1);
		IBinding b4 = getBindingFromASTName("i/*4*/", 1);
		IBinding b5 = getBindingFromASTName("i/*5*/", 1);
		IBinding b6 = getBindingFromASTName("i/*6*/", 1);
		IBinding b7 = getBindingFromASTName("i/*7*/", 1);
		IBinding b8 = getBindingFromASTName("i/*8*/", 1);
		IBinding b9 = getBindingFromASTName("i/*9*/", 1);
		IBinding b10 = getBindingFromASTName("i/*10*/", 1);
		IBinding b11 = getBindingFromASTName("i/*11*/", 1);
		IBinding b12 = getBindingFromASTName("i/*12*/", 1);
		IBinding b13 = getBindingFromASTName("i/*13*/", 1);
		IBinding b14 = getBindingFromASTName("i/*14*/", 1);
		IBinding b15 = getBindingFromASTName("i/*15*/", 1);
		IBinding b16 = getBindingFromASTName("i/*16*/", 1);
		IBinding b17 = getBindingFromASTName("i/*17*/", 1);
		IBinding b18 = getBindingFromASTName("i/*18*/", 1);
	}

	//	class C {public: C* cp;};
	//	C foo(C c);
	//	C* foo(C* c);
	//	int foo(int i);
	//	int foo(int i, C c);

	//	void references() {
	//		C c, *cp;
	//		foo/*a*/(cp[1]);                        // IASTArraySubscriptExpression
	//		foo/*b*/(cp+1);                         // IASTBinaryExpression
	//		foo/*c*/((C*) cp);/*1*/                 // IASTCastExpression
	//		foo/*d*/(true ? c : c);/*2*/            // IASTConditionalExpression
	//		foo/*e*/(5, c);/*3*/                    // IASTExpressionList
	//		foo/*f*/(c.cp);/*4*/ foo(cp->cp);/*5*/  // IASTFieldReference
	//		foo/*g*/(foo(c));/*6*/ foo(foo(1));/*7*/// IASTFunctionCallExpression
	//		foo/*h*/(c);/*8*/                       // IASTIdExpression
	//		foo/*i*/(23489);                        // IASTLiteralExpression
	//		foo/*j*/(sizeof(C));/*9*/               // IASTTypeIdExpression
	//		foo/*k*/(*cp);/*10*/                    // IASTUnaryExpression
	//		foo/*m*/(new C());/*12*/                // ICPPASTNewExpression
	//		// ?? foo/*n*/();                       // ICPPASTSimpleTypeConstructorExpression
	//		// ?? foo/*o*/();                       // ICPPASTTypenameExprssion
	//		// foo/*p*/(MADE_UP_SYMBOL);            // ICPPASTTypenameExprssion
	//	}
	public void testExpressionKindForFunctionCalls() {
		// depends on bug 164470 because resolution takes place during parse.
		IBinding b0 = getBindingFromASTName("foo/*a*/", 3);
		IBinding b0a = getBindingFromASTName("cp[1]", 2);
		// assertCompositeTypeParam(0, ICPPClassType.k_class, b0, "C");

		IBinding b1 = getBindingFromASTName("foo/*b*/", 3);
		IBinding b1a = getBindingFromASTName("cp+1", 2);

		IBinding b2 = getBindingFromASTName("foo/*c*/", 3);
		IBinding b2a = getBindingFromASTName("cp);/*1*/", 2);

		IBinding b3 = getBindingFromASTName("foo/*d*/", 3);
		IBinding b3a = getBindingFromASTName("c : c", 1);
		IBinding b3b = getBindingFromASTName("c);/*2*/", 1);

		IBinding b4 = getBindingFromASTName("foo/*e*/", 3);
		IBinding b4a = getBindingFromASTName("c);/*3*/", 1);

		IBinding b5 = getBindingFromASTName("cp);/*4*/", 2);
		IBinding b5a = getBindingFromASTName("foo/*f*/", 3);
		IBinding b5b = getBindingFromASTName("cp->cp);/*5*/", 2);
		IBinding b5c = getBindingFromASTName("cp);/*5*/", 2);

		IBinding b6 = getBindingFromASTName("foo/*g*/", 3);
		IBinding b6a = getBindingFromASTName("foo(c));/*6*/", 3);
		IBinding b6b = getBindingFromASTName("c));/*6*/", 1);
		IBinding b6c = getBindingFromASTName("foo(foo(1));/*7*/", 3);
		IBinding b6d = getBindingFromASTName("foo(1));/*7*/", 3);

		IBinding b7 = getBindingFromASTName("foo/*h*/", 3);
		IBinding b7a = getBindingFromASTName("c);/*8*/", 1);

		IBinding b8 = getBindingFromASTName("foo/*i*/", 3);

		IBinding b9 = getBindingFromASTName("foo/*j*/", 3);
		IBinding b9a = getBindingFromASTName("C));/*9*/", 1);

		IBinding b10 = getBindingFromASTName("foo/*k*/", 3);
		IBinding b10a = getBindingFromASTName("cp);/*10*/", 2);

		IBinding b12 = getBindingFromASTName("foo/*m*/", 3);
		IBinding b12a = getBindingFromASTName("C());/*12*/", 1);
		// IBinding b13 = getBindingFromASTName(ast, "foo/*n*/", 3);
	}

	//	class C { public:
	//	typedef int i1;	typedef long *lp1;
	//	class C1 {}; struct S1 {}; union U1 {}; enum E1 {A1};
	//	};
	//	struct S { public:
	//	typedef int i2; typedef long *lp2;
	//	class C2 {}; struct S2 {}; union U2 {}; enum E2 {A2};
	//	};
	//	union U { public:
	//	typedef int i3; typedef long *lp3;
	//	class C3 {}; struct S3 {}; union U3 {}; enum E3 {A3};
	//	};
	//	enum E {A};
	//	namespace n {
	//		typedef int i4;	typedef long *lp4;
	//		class C4 {}; struct S4 {}; union U4 {}; enum E4 {A4};
	//	}
	//	void f(int);
	//	void f(long);
	//	void f(C); void f(C::i1); void f(C::lp1); void f(C::S1); void f(C::U1); void f(C::E1);
	//	void f(S); void f(S::i2); void f(S::lp2); void f(S::S2); void f(S::U2); void f(S::E2);
	//	void f(U); void f(U::i3); void f(U::lp3); void f(U::S3); void f(U::U3); void f(U::E3);
	//	void f(n::i4); void f(n::lp4); void f(n::S4); void f(n::U4); void f(n::E4);
	//	void f(E);

	//	void references() {
	//		void (*fintptr)(int), (*flongptr)(long);
	//		void (*fC)(C), (*fCi1)(C::i1), (*fClp1)(C::lp1), (*fCS1)(C::S1), (*fCU1)(C::U1), (*fCE1)(C::E1);
	//		void (*fS)(S), (*fSi2)(S::i2), (*fSlp2)(S::lp2), (*fSS2)(S::S2), (*fSU2)(S::U2), (*fSE2)(S::E2);
	//		void (*fU)(U), (*fUi3)(U::i3), (*fUlp3)(U::lp3), (*fUS3)(U::S3), (*fUU3)(U::U3), (*fUE3)(U::E3);
	//		void           (*fni4)(n::i4), (*fnlp4)(n::lp4), (*fnS4)(n::S4), (*fnU4)(n::U4), (*fnE4)(n::E4);
	//		void (*fE)(E);
	//		fintptr = &f;/*0*/ flongptr = &f;/*1*/
	//		fC = &f;/*2*/ fCi1 = &f;/*3*/ fClp1 = &f;/*4*/ fCS1 = &f;/*5*/ fCU1 = &f;/*6*/ fCE1 = &f;/*7*/
	//		fS = &f;/*8*/ fSi2 = &f;/*9*/ fSlp2 = &f;/*10*/ fSS2 = &f;/*11*/ fSU2 = &f;/*12*/ fSE2 = &f;/*13*/
	//		fU = &f;/*14*/ fUi3 = &f;/*15*/ fUlp3 = &f;/*16*/ fUS3 = &f;/*17*/ fUU3 = &f;/*18*/ fUE3 = &f;/*19*/
	//		         fni4 = &f;/*20*/ fnlp4 = &f;/*21*/ fnS4 = &f;/*22*/ fnU4 = &f;/*23*/ fnE4 = &f;/*24*/
	//		fE = &f;/*25*/
	//	}
	public void testAddressOfOverloadedFunction() throws DOMException {
		IBinding b0 = getBindingFromASTName("f;/*0*/", 1);
		IBinding b1 = getBindingFromASTName("f;/*1*/", 1);
		IBinding b2 = getBindingFromASTName("f;/*2*/", 1);
		IBinding b3 = getBindingFromASTName("f;/*3*/", 1);
		IBinding b4 = getBindingFromASTName("f;/*4*/", 1);
		IBinding b5 = getBindingFromASTName("f;/*5*/", 1);
		IBinding b6 = getBindingFromASTName("f;/*6*/", 1);
		IBinding b7 = getBindingFromASTName("f;/*7*/", 1);
		IBinding b8 = getBindingFromASTName("f;/*8*/", 1);
		IBinding b9 = getBindingFromASTName("f;/*9*/", 1);
		IBinding b10 = getBindingFromASTName("f;/*10*/", 1);
		IBinding b11 = getBindingFromASTName("f;/*11*/", 1);
		IBinding b12 = getBindingFromASTName("f;/*12*/", 1);
		IBinding b13 = getBindingFromASTName("f;/*13*/", 1);
		IBinding b14 = getBindingFromASTName("f;/*14*/", 1);
		IBinding b15 = getBindingFromASTName("f;/*15*/", 1);
		IBinding b16 = getBindingFromASTName("f;/*16*/", 1);
		IBinding b17 = getBindingFromASTName("f;/*17*/", 1);
		IBinding b18 = getBindingFromASTName("f;/*18*/", 1);
		IBinding b19 = getBindingFromASTName("f;/*19*/", 1);
		IBinding b20 = getBindingFromASTName("f;/*20*/", 1);
		IBinding b21 = getBindingFromASTName("f;/*21*/", 1);
		IBinding b22 = getBindingFromASTName("f;/*22*/", 1);
		IBinding b23 = getBindingFromASTName("f;/*23*/", 1);
		IBinding b24 = getBindingFromASTName("f;/*24*/", 1);
	}

	// struct C {
	//	 int m1(int a);
	//	 int m2(int a) const;
	// };
	//
	// C* func(int (C::*m)(int) const);
	// C* func(int (C::*m)(int));

	// void ref() {
	//	 func(&C::m1);
	//	 func(&C::m2);
	// }
	public void testAddressOfConstMethod_233889() {
		IBinding fn1 = getBindingFromASTName("func(&C::m1", 4, ICPPFunction.class);
		IBinding fn2 = getBindingFromASTName("func(&C::m2", 4, ICPPFunction.class);
		assertNotSame(fn1, fn2);
	}

	// void f_int(int);
	// void f_const_int(const int);
	// void f_int_ptr(int*);

	// void ref() {
	// 	 int 			i				= 0;
	//   const int 		const_int		= 0;
	//
	//   f_int(i);				 // ok
	//   f_int(const_int);       // ok (passed as value)
	//   f_const_int(i);		 // ok
	//   f_const_int(const_int); // ok
	// }
	//
	//  void f_const_int(const int const_int) {
	//     f_int_ptr(&const_int); // error
	//  }
	public void testConstIntParameter() {
		getBindingFromASTName("f_int(i)", 5);
		getBindingFromASTName("f_int(const_int)", 5);
		getBindingFromASTName("f_const_int(i)", 11);
		getBindingFromASTName("f_const_int(const_int)", 11);
		getProblemFromASTName("f_int_ptr(&const_int)", 9);
	}

	// void f_int_ptr(int*);
	// void f_const_int_ptr(const int*);
	// void f_int_const_ptr(int const*);
	// void f_int_ptr_const(int *const);
	// void f_const_int_ptr_const(const int*const);
	// void f_int_const_ptr_const(int const*const);

	// void ref() {
	// 	 int* 			int_ptr			= 0;
	//   const int*		const_int_ptr   = 0;
	// 	 int const*     int_const_ptr	= 0;
	// 	 int *const     int_ptr_const	= 0;
	//   const int*const		const_int_ptr_const   = 0;
	//   int const*const		int_const_ptr_const   = 0;
	//
	//   f_int_ptr(int_ptr);				// ok
	//   f_int_ptr(const_int_ptr);			// error
	//   f_int_ptr(int_const_ptr);			// error
	//   f_int_ptr(int_ptr_const);			// ok
	//   f_int_ptr(const_int_ptr_const);	// error
	//   f_int_ptr(int_const_ptr_const);	// error
	//
	//   f_const_int_ptr(int_ptr);				// ok
	//   f_const_int_ptr(const_int_ptr);		// ok
	//   f_const_int_ptr(int_const_ptr);		// ok
	//   f_const_int_ptr(int_ptr_const);		// ok
	//   f_const_int_ptr(const_int_ptr_const);	// ok
	//   f_const_int_ptr(int_const_ptr_const);	// ok
	//
	//   f_int_const_ptr(int_ptr);				// ok
	//   f_int_const_ptr(const_int_ptr);		// ok
	//   f_int_const_ptr(int_const_ptr);		// ok
	//   f_int_const_ptr(int_ptr_const);		// ok
	//   f_int_const_ptr(const_int_ptr_const);	// ok
	//   f_int_const_ptr(int_const_ptr_const);	// ok
	//
	//   f_int_ptr_const(int_ptr);				// ok
	//   f_int_ptr_const(const_int_ptr);		// error
	//   f_int_ptr_const(int_const_ptr);		// error
	//   f_int_ptr_const(int_ptr_const);		// ok
	//   f_int_ptr_const(const_int_ptr_const);	// error
	//   f_int_ptr_const(int_const_ptr_const);	// error
	//
	//   f_const_int_ptr_const(int_ptr);			 // ok
	//   f_const_int_ptr_const(const_int_ptr);		 // ok
	//   f_const_int_ptr_const(int_const_ptr);		 // ok
	//   f_const_int_ptr_const(int_ptr_const);		 // ok
	//   f_const_int_ptr_const(const_int_ptr_const); // ok
	//   f_const_int_ptr_const(int_const_ptr_const); // ok
	//
	//   f_int_const_ptr_const(int_ptr);				// ok
	//   f_int_const_ptr_const(const_int_ptr);			// ok
	//   f_int_const_ptr_const(int_const_ptr);			// ok
	//   f_int_const_ptr_const(int_ptr_const);			// ok
	//   f_int_const_ptr_const(const_int_ptr_const);	// ok
	//   f_int_const_ptr_const(int_const_ptr_const);	// ok
	// }
	public void testConstIntPtrParameter() {
		getBindingFromASTName("f_int_ptr(int_ptr)", 9);
		getProblemFromASTName("f_int_ptr(const_int_ptr)", 9);
		getProblemFromASTName("f_int_ptr(int_const_ptr)", 9);
		getBindingFromASTName("f_int_ptr(int_ptr_const)", 9);
		getProblemFromASTName("f_int_ptr(const_int_ptr_const)", 9);
		getProblemFromASTName("f_int_ptr(int_const_ptr_const)", 9);

		getBindingFromASTName("f_const_int_ptr(int_ptr)", 15);
		getBindingFromASTName("f_const_int_ptr(const_int_ptr)", 15);
		getBindingFromASTName("f_const_int_ptr(int_const_ptr)", 15);
		getBindingFromASTName("f_const_int_ptr(int_ptr_const)", 15);
		getBindingFromASTName("f_const_int_ptr(const_int_ptr_const)", 15);
		getBindingFromASTName("f_const_int_ptr(int_const_ptr_const)", 15);

		getBindingFromASTName("f_int_const_ptr(int_ptr)", 15);
		getBindingFromASTName("f_int_const_ptr(const_int_ptr)", 15);
		getBindingFromASTName("f_int_const_ptr(int_const_ptr)", 15);
		getBindingFromASTName("f_int_const_ptr(int_ptr_const)", 15);
		getBindingFromASTName("f_int_const_ptr(const_int_ptr_const)", 15);
		getBindingFromASTName("f_int_const_ptr(int_const_ptr_const)", 15);

		getBindingFromASTName("f_int_ptr_const(int_ptr)", 15);
		getProblemFromASTName("f_int_ptr_const(const_int_ptr)", 15);
		getProblemFromASTName("f_int_ptr_const(int_const_ptr)", 15);
		getBindingFromASTName("f_int_ptr_const(int_ptr_const)", 15);
		getProblemFromASTName("f_int_ptr_const(const_int_ptr_const)", 15);
		getProblemFromASTName("f_int_ptr_const(int_const_ptr_const)", 15);

		getBindingFromASTName("f_const_int_ptr_const(int_ptr)", 21);
		getBindingFromASTName("f_const_int_ptr_const(const_int_ptr)", 21);
		getBindingFromASTName("f_const_int_ptr_const(int_const_ptr)", 21);
		getBindingFromASTName("f_const_int_ptr_const(int_ptr_const)", 21);
		getBindingFromASTName("f_const_int_ptr_const(const_int_ptr_const)", 21);
		getBindingFromASTName("f_const_int_ptr_const(int_const_ptr_const)", 21);

		getBindingFromASTName("f_int_const_ptr_const(int_ptr)", 21);
		getBindingFromASTName("f_int_const_ptr_const(const_int_ptr)", 21);
		getBindingFromASTName("f_int_const_ptr_const(int_const_ptr)", 21);
		getBindingFromASTName("f_int_const_ptr_const(int_ptr_const)", 21);
		getBindingFromASTName("f_int_const_ptr_const(const_int_ptr_const)", 21);
		getBindingFromASTName("f_int_const_ptr_const(int_const_ptr_const)", 21);
	}

	// // the header

	// void f(int*){}		// b1
	// void f(const int*){}	// b2
	// void f(int const*){}	// b2, redef
	// void f(int *const){}	// b1, redef
	// void f(const int*const){} // b2, redef
	// void f(int const*const){} // b2, redef
	public void testConstIntPtrParameterInDefinitionAST() throws CoreException {
		IBinding binding1 = getBindingFromASTName("f(int*){}", 1);
		IBinding binding2 = getBindingFromASTName("f(const int*){}", 1);
		getProblemFromASTName("f(int const*){}", 1);
		getProblemFromASTName("f(int *const){}", 1);
		getProblemFromASTName("f(const int*const){}", 1);
		getProblemFromASTName("f(int const*const){}", 1);
	}

	// // the header

	// void f(int&){}		// b1
	// void f(const int&){}	// b2
	// void f(int const&){}	// b2, redef
	public void testConstIntRefParameterInDefinitionAST() throws CoreException {
		IBinding binding1 = getBindingFromASTName("f(int&){}", 1);
		IBinding binding2 = getBindingFromASTName("f(const int&){}", 1);
		getProblemFromASTName("f(int const&){}", 1);
	}

	// // the header

	// void f(int*);		// b1
	// void f(const int*);	// b2
	// void f(int const*);	// b2
	// void f(int *const);	// b1
	// void f(const int*const);	// b2
	// void f(int const*const); // b2
	//
	// void f(int*){}		// b1
	// void f(const int*){}	// b2
	//
	// void ref() {
	// 	 int* 			int_ptr			= 0;
	//   const int*		const_int_ptr   = 0;
	// 	 int const*     int_const_ptr	= 0;
	// 	 int *const     int_ptr_const	= 0;
	//   const int*const		const_int_ptr_const   = 0;
	//   int const*const		int_const_ptr_const   = 0;
	//
	//   f(int_ptr);				// b1
	//   f(const_int_ptr);			// b2
	//   f(int_const_ptr);			// b2
	//   f(int_ptr_const);			// b1
	//   f(const_int_ptr_const);	// b2
	//   f(int_const_ptr_const);	// b2
	// }
	public void testConstIntPtrParameterInDefinitionAST2() throws CoreException {
		IBinding binding1 = getBindingFromASTName("f(int*){}", 1);
		IBinding binding2 = getBindingFromASTName("f(const int*){}", 1);

		assertEquals(binding1, getBindingFromASTName("f(int_ptr)", 1));
		assertEquals(binding2, getBindingFromASTName("f(const_int_ptr)", 1));
		assertEquals(binding2, getBindingFromASTName("f(int_const_ptr)", 1));
		assertEquals(binding1, getBindingFromASTName("f(int_ptr_const)", 1));
		assertEquals(binding2, getBindingFromASTName("f(const_int_ptr_const)", 1));
		assertEquals(binding2, getBindingFromASTName("f(int_const_ptr_const)", 1));
	}

	// void f(int*);		// b1
	// void f(const int*);	// b2
	// void f(int const*);	// b2
	// void f(int *const);	// b1
	// void f(const int*const);	// b2
	// void f(int const*const); // b2

	// void f(int*){}		// b1
	// void f(const int*){}	// b2
	//
	// void ref() {
	// 	 int* 			int_ptr			= 0;
	//   const int*		const_int_ptr   = 0;
	// 	 int const*     int_const_ptr	= 0;
	// 	 int *const     int_ptr_const	= 0;
	//   const int*const		const_int_ptr_const   = 0;
	//   int const*const		int_const_ptr_const   = 0;
	//
	//   f(int_ptr);				// b1
	//   f(const_int_ptr);			// b2
	//   f(int_const_ptr);			// b2
	//   f(int_ptr_const);			// b1
	//   f(const_int_ptr_const);	// b2
	//   f(int_const_ptr_const);	// b2
	// }
	public void testConstIntPtrParameterInDefinition() throws CoreException {
		IBinding binding1 = getBindingFromASTName("f(int*){}", 1);
		IBinding binding2 = getBindingFromASTName("f(const int*){}", 1);

		assertEquals(binding1, getBindingFromASTName("f(int_ptr)", 1));
		assertEquals(binding2, getBindingFromASTName("f(const_int_ptr)", 1));
		assertEquals(binding2, getBindingFromASTName("f(int_const_ptr)", 1));
		assertEquals(binding1, getBindingFromASTName("f(int_ptr_const)", 1));
		assertEquals(binding2, getBindingFromASTName("f(const_int_ptr_const)", 1));
		assertEquals(binding2, getBindingFromASTName("f(int_const_ptr_const)", 1));

		assertEquals(2, getIndex().findNames(binding1, IIndex.FIND_DECLARATIONS).length);
		assertEquals(4, getIndex().findNames(binding2, IIndex.FIND_DECLARATIONS).length);
		assertEquals(1, getIndex().findNames(binding1, IIndex.FIND_DEFINITIONS).length);
		assertEquals(1, getIndex().findNames(binding2, IIndex.FIND_DEFINITIONS).length);
	}

	// // header file
	// struct myStruct {
	//    int a;
	// };
	// union myUnion {
	//    int b;
	// };

	// // referencing content
	// struct myStruct;
	// union myUnion;
	// void test() {
	//    struct myStruct* u;
	//    union myUnion* v;
	//    u->a= 1;  // since we include the definition, we may use the type.
	//    v->b= 1;  // since we include the definition, we may use the type.
	// }
	public void testTypeDefinitionWithFwdDeclaration() {
		getBindingFromASTName("a= 1", 1);
		getBindingFromASTName("b= 1", 1);
	}

	// namespace x {
	//    int a(int);
	// }
	// using namespace x;
	// using x::a;

	// void test() {
	//    a(1);
	// }
	public void testLegalConflictWithUsingDeclaration() {
		getBindingFromASTName("a(1)", 1);
	}

	//	class A {};
	//	class B {};
	//	class C {
	//	public:
	//		operator B() {B b; return b;}
	//	};
	//	class D : public C {};
	//	void foo(B b) {}

	//  class E : public C {};
	//	void refs() {
	//		C c;
	//		foo(c);
	//		D d;
	//		foo(d);
	//		E e;
	//		foo(e);
	//	}
	public void testUserDefinedConversionOperator_224364() {
		IBinding ca = getBindingFromASTName("C c;", 1);
		assertInstance(ca, ICPPClassType.class);

		IBinding foo1 = getBindingFromASTName("foo(c)", 3);

		IBinding da = getBindingFromASTName("D d", 1);
		assertInstance(da, ICPPClassType.class);

		IBinding foo2 = getBindingFromASTName("foo(d)", 3);
		IBinding foo3 = getBindingFromASTName("foo(e)", 3);
	}

	// int a= 1+2-3*4+10/2; // -4
	// int b= a+4;
	// int* c= &b;
	// enum X {e0, e4=4, e5, e2=2, e3};

	// void ref() {
	// a; b; c; e0; e2; e3; e4; e5;
	// }
	public void testValues() {
		IVariable v = (IVariable) getBindingFromASTName("a;", 1);
		asserValueEquals(v.getInitialValue(), -4);
		v = (IVariable) getBindingFromASTName("b;", 1);
		asserValueEquals(v.getInitialValue(), 0);
		v = (IVariable) getBindingFromASTName("c;", 1);
		assertNull(v.getInitialValue().numberValue());

		IEnumerator e = (IEnumerator) getBindingFromASTName("e0", 2);
		asserValueEquals(e.getValue(), 0);
		e = (IEnumerator) getBindingFromASTName("e2", 2);
		asserValueEquals(e.getValue(), 2);
		e = (IEnumerator) getBindingFromASTName("e3", 2);
		asserValueEquals(e.getValue(), 3);
		e = (IEnumerator) getBindingFromASTName("e4", 2);
		asserValueEquals(e.getValue(), 4);
		e = (IEnumerator) getBindingFromASTName("e5", 2);
		asserValueEquals(e.getValue(), 5);
	}

	//	namespace ns1 { namespace ns2 {
	//	  class A {};
	//	}}
	//	using namespace ns1::ns2;

	//	A a;
	public void testUsingDirectiveWithQualifiedName_269727() {
		getBindingFromASTName("A a", 1, ICPPClassType.class);
	}

	// void f(int (&v)[1]);
	// void f(int (&v)[2]);

	// void test() {
	//   int a[1], b[2];
	//   f(a); f(b);
	// }
	public void testArrayTypeWithSize_269926() {
		IFunction f1 = getBindingFromASTName("f(a)", 1, IFunction.class);
		IFunction f2 = getBindingFromASTName("f(b)", 1, IFunction.class);
		assertFalse(f1.equals(f2));
	}

	//	struct Params {
	//	    constexpr Params(int, int) {}
	//	};
	//	struct Desc {
	//	    Desc(const Params*, int = 0);
	//	};
	//	struct Descs {
	//	    Desc a;
	//	    Desc b[2];
	//	};
	//	struct S {
	//	    static Descs waldo;
	//	};
	//	constexpr Params params[1] = {
	//	    { 0, 0 },
	//	};
	//	struct Descs S::waldo = {
	//	    {nullptr},
	//	    {
	//	        {params, 0},
	//	        {params, 0},
	//	    },
	//	};

	//	// empty file
	public void testArrayWithOneElement_508254() throws Exception {
		checkBindings();
	}

	//	class A {
	//	  class B;
	//	  void method();
	//	};

	//	class A::B {
	//	  B(int x);
	//    static void m(int p);
	//	};
	//
	//	void A::method() {
	//	  new B(0);
	//    B::m(0);
	//	}
	public void testNestedClass_284665() {
		ICPPClassType b0 = getBindingFromASTName("B {", 1, ICPPClassType.class);
		assertFalse(b0 instanceof IIndexBinding);
		ICPPConstructor b1 = getBindingFromASTName("B(int x)", 1, ICPPConstructor.class);
		assertFalse(b1 instanceof IIndexBinding);
		ICPPClassType b2 = getBindingFromASTName("B(0)", 1, ICPPClassType.class);
		ICPPMethod b3 = getBindingFromASTName("m(0)", 1, ICPPMethod.class);
		assertFalse(b3 instanceof IIndexBinding);
	}

	//	class A {
	//	  friend inline void m(A p) {}
	//	};

	//	void test(A a) {
	//	  m(a);
	//	}
	public void testInlineFriendFunction_284690() {
		getBindingFromASTName("m(a)", 1, IFunction.class);
	}

	//	namespace ns {
	//		struct S {};
	//	}
	//	namespace m {
	//		void h(ns::S);
	//	}
	//	namespace ns {
	//		inline namespace a {
	//			using namespace m;
	//			struct A {};
	//			void fa(S s);
	//		}
	//		inline namespace b {
	//			struct B {};
	//			void fb(S s);
	//			void gb(a::A);
	//		}
	//		void f(S s);
	//		void g(a::A);
	//		void g(b::B);
	//	}

	//	ns::S s;
	//	ns::A a0;
	//	ns::B b0;
	//	ns::a::A a;
	//	ns::b::B b;
	//
	//	void ok() {
	//		fa(s); fb(s); f(s);
	//		g(a);
	//		gb(a);
	//	}
	public void testInlineNamespace_305980a() {
		IFunction f = getBindingFromASTName("fa(s)", 2);
		f = getBindingFromASTName("fb(s)", 2);
		f = getBindingFromASTName("f(s)", 1);
		f = getBindingFromASTName("g(a)", 1);
		f = getBindingFromASTName("gb(a)", 2);
	}

	//	namespace ns {
	//		struct S {};
	//	}
	//	namespace m {
	//		void h(ns::S);
	//	}
	//	namespace ns {
	//		inline namespace a {
	//			using namespace m;
	//			struct A {};
	//			void fa(S s);
	//		}
	//		inline namespace b {
	//			struct B {};
	//			void fb(S s);
	//			void gb(a::A);
	//		}
	//		void f(S s);
	//		void g(a::A);
	//		void g(b::B);
	//	}

	//  namespace ns {}
	//  namespace m {}
	//	ns::S s;
	//	ns::A a0;
	//	ns::B b0;
	//	ns::a::A a;
	//	ns::b::B b;
	//
	//	void ok() {
	//		fa(s); fb(s); f(s);
	//		g(a);
	//		gb(a);
	//	}
	public void testInlineNamespace_305980am() {
		IFunction f = getBindingFromASTName("fa(s)", 2);
		f = getBindingFromASTName("fb(s)", 2);
		f = getBindingFromASTName("f(s)", 1);
		f = getBindingFromASTName("g(a)", 1);
		f = getBindingFromASTName("gb(a)", 2);
	}

	//	namespace ns {
	//		inline namespace m {
	//			int a;
	//		}
	//	}

	//	void test() {
	//		ns::m::a; //1
	//		ns::a; //2
	//	}
	public void testInlineNamespace_305980b() {
		IVariable v1 = getBindingFromASTName("a; //1", 1);
		IVariable v2 = getBindingFromASTName("a; //2", 1);
		assertEquals(v1, v2);
	}

	//	namespace ns {
	//		inline namespace m {
	//			int a;
	//		}
	//	}

	//  namespace ns {
	//	   void test() {
	//		  m::a; //1
	//		  a; //2
	//     }
	//  }
	//	void test() {
	//		ns::m::a; //3
	//		ns::a; //4
	//	}
	public void testInlineNamespace_305980bm() {
		IVariable v1 = getBindingFromASTName("a; //1", 1);
		IVariable v2 = getBindingFromASTName("a; //2", 1);
		IVariable v3 = getBindingFromASTName("a; //3", 1);
		IVariable v4 = getBindingFromASTName("a; //4", 1);
		assertEquals(v1, v2);
		assertEquals(v2, v3);
		assertEquals(v3, v4);
	}

	//	namespace out {
	//		void f(int);
	//	}
	//  namespace out2 {
	//      void g(int);
	//  }
	//	using namespace out;
	//	inline namespace in {
	//      inline namespace in2 {
	//		   void f(char);
	//         using namespace out2;
	//      }
	//	}

	//	void test() {
	//		::f(1);
	//      ::g(1);
	//	}
	public void testInlineNamespace_305980c() {
		IFunction ref = getBindingFromASTName("f(1)", 1);
		assertEquals("void (char)", ASTTypeUtil.getType(ref.getType()));
		getBindingFromASTName("g(1)", 1);
	}

	//	namespace out {
	//		void f(int);
	//	}
	//  namespace out2 {
	//      void g(int);
	//  }
	//	using namespace out;
	//	inline namespace in {
	//      inline namespace in2 {
	//		   void f(char);
	//         using namespace out2;
	//      }
	//	}

	//	namespace out {}
	//  namespace out2 {}
	//	namespace in {}
	//	void test() {
	//		::f(1);
	//      ::g(1);
	//	}
	public void testInlineNamespace_305980cm() {
		IFunction ref = getBindingFromASTName("f(1)", 1);
		assertEquals("void (char)", ASTTypeUtil.getType(ref.getType()));
		getBindingFromASTName("g(1)", 1);
	}

	//	namespace std {
	//	    inline namespace __cxx11 { }
	//	}

	//	namespace std {
	//	    namespace __cxx11 {
	//	        class string {};
	//	    }
	//	    void regex_match(string);  // Type 'string' could not be resolved
	//	}
	public void testInlineNamespaceReopenedWithoutInlineKeyword_483824() {
		checkBindings();
	}

	//	namespace ns {
	//		void fun();
	//	}

	//	namespace alias = ns;
	//	void alias::fun() {
	//	}
	public void testNamespaceAliasAsQualifier_356493a() {
		IFunction ref = getBindingFromASTName("fun", 0);
		assertEquals("ns", ref.getOwner().getName());
	}

	//	namespace ns {
	//		void fun();
	//	}
	//	namespace alias = ns;

	//	void alias::fun() {
	//	}
	public void testNamespaceAliasAsQualifier_356493b() {
		IFunction ref = getBindingFromASTName("fun", 0);
		assertEquals("ns", ref.getOwner().getName());
	}

	//	class A {};
	//	void f(A a) {}
	//	struct B {};
	//	void g(B b) {}

	//	struct A;
	//	class B;
	//
	//	void test(A a, B b) {
	//	  f(a);
	//	  g(b);
	//	}
	public void testStructClassMismatch_358282() {
		getBindingFromASTName("f(a)", 1, ICPPFunction.class);
		getBindingFromASTName("g(b)", 1, ICPPFunction.class);
	}

	//	namespace {
	//	  class A {};
	//	}

	//	A a;
	public void testAnonymousNamespace() {
		getBindingFromFirstIdentifier("A", ICPPClassType.class);
	}

	//	namespace ns {
	//	namespace {
	//	const char str[] = "";
	//	}
	//	}

	//	namespace {
	//	const char str[] = "";
	//	}
	//
	//	namespace ns {
	//
	//	void f(const char* s);
	//
	//	void test() {
	//	  f(str);
	//	}
	//
	//	}
	public void testAnonymousNamespaces_392577() {
		getBindingFromFirstIdentifier("f(str)", ICPPFunction.class);
	}

	//	namespace ns {
	//		typedef int INT;
	//	}

	//	namespace {
	//	namespace ns {
	//	    using ::ns::INT;
	//	}
	//	}
	public void testAnonymousNamespaces_418130() {
		checkBindings();
	}

	//	struct A {
	//	  A(int);
	//	};

	//	struct B : public A {
	//	  using A::A;
	//	};
	//
	//	void foo(B);
	//
	//	int test() {
	//	  foo(1);
	//	}
	public void testInheritedConstructor() {
		checkBindings();
	}

	//	template <class T>
	//	struct A {
	//	  A(T);
	//	};

	//	struct B : public A<int> {
	//	  using A::A;
	//	};
	//
	//	void foo(B);
	//
	//	int test() {
	//	  foo(1);
	//	}
	public void testInheritedConstructorFromTemplateInstance() {
		checkBindings();
	}

	//	struct A {
	//	  A(int);
	//	};
	//
	//	template <class T>
	//	struct B : public T {
	//	  using T::T;
	//	};

	//	void foo(B<A>);
	//
	//	int test() {
	//	  foo(1);
	//	}
	public void testInheritedConstructorFromUnknownClass() {
		checkBindings();
	}

	//	template <typename T>
	//	struct A {};
	//
	//	struct B {
	//	  template <typename T>
	//	  B(const A<T>&, int i = 3);
	//	};
	//
	//	struct C : public B {
	//	  using B::B;
	//	};

	//	void foo(C);
	//
	//	void test(A<int> a) {
	//	  foo(a);
	//	}
	public void testInheritedTemplateConstructor() {
		checkBindings();
	}

	//	constexpr int foo(int a = 42) {
	//		return a;
	//	}

	//	constexpr int waldo = foo();
	public void testNameLookupInDefaultArgument_432701() {
		IVariable waldo = getBindingFromASTName("waldo", 5);
		assertEquals(42, waldo.getInitialValue().numberValue().longValue());
	}

	//	struct function {
	//	    template <typename T>
	//	    function(T);
	//	};
	//
	//	struct test {
	//		// These lambdas have the class 'test' as their owner.
	//	    test(function f = [](int c) { return c; });
	//		function member = [](int c) { return c; };
	//	};

	//	int z;
	public void testLambdaOwnedByClass_409882() {
		checkBindings();
	}

	//	struct A {
	//	  auto a = [](int p) { int waldo = p; return waldo; };
	//	};

	//  // No code in this file.
	public void testLambdaOwnedByClass_449099() {
		checkBindings();
	}

	//	extern char TableValue[10];

	//	char TableValue[sizeof TableValue];
	public void testNameLookupFromArrayModifier_435075() {
		checkBindings();
	}

	//	struct S {
	//	    int* a;
	//	    int* b;
	//	};
	//
	//	constexpr S waldo = { nullptr, waldo.a };

	//  // empty file
	public void testVariableInitializerThatReferencesVariable_508254a() throws Exception {
		checkBindings();
	}

	//	struct S {
	//	    int* a;
	//	    int* b;
	//	};
	//
	//	constexpr S waldo = { nullptr, waldo.a };
	//
	//	struct T {
	//	    int *pBlock;
	//	};
	//
	//	static const constexpr T greebo[] = {
	//		{ waldo.a },
	//	};

	//	// empty file
	public void testVariableInitializerThatReferencesVariable_508254b() throws Exception {
		checkBindings();
	}

	// class NonVirt {
	//   void m();
	// };
	// class C1 : NonVirt {
	//   virtual void m();
	// };
	// class C2 : C1 {
	//   void m();
	// };
	// class C3 : C2 {
	//   void m(int);
	// };
	// class C4 : C3 {
	//   void m();
	// };
	// class C5 : C1 {
	//   void m();
	// };

	//	void test(NonVirt* n, C1* c1, C2* c2, C3* c3, C4* c4, C5* c5) {
	//	  n->m();//0
	//	  c1->m();//1
	//	  c2->m();//2
	//	  c3->m(0);//3
	//	  c4->m();//4
	//	  c5->m();//5
	//	}
	public void testOverridden_248846() throws Exception {
		ICPPMethod m0 = getBindingFromFirstIdentifier("m();//0");
		ICPPMethod m1 = getBindingFromFirstIdentifier("m();//1");
		ICPPMethod m2 = getBindingFromFirstIdentifier("m();//2");
		ICPPMethod m3 = getBindingFromFirstIdentifier("m(0);");
		ICPPMethod m4 = getBindingFromFirstIdentifier("m();//4");
		ICPPMethod m5 = getBindingFromFirstIdentifier("m();//5");

		assertFalse(ClassTypeHelper.isVirtual(m0));
		assertFalse(ClassTypeHelper.isVirtual(m3));
		assertTrue(ClassTypeHelper.isVirtual(m1));
		assertTrue(ClassTypeHelper.isVirtual(m2));
		assertTrue(ClassTypeHelper.isVirtual(m4));
		assertTrue(ClassTypeHelper.isVirtual(m5));

		assertFalse(ClassTypeHelper.isOverrider(m0, m0));
		assertFalse(ClassTypeHelper.isOverrider(m1, m0));
		assertFalse(ClassTypeHelper.isOverrider(m2, m0));
		assertFalse(ClassTypeHelper.isOverrider(m3, m0));
		assertFalse(ClassTypeHelper.isOverrider(m4, m0));
		assertFalse(ClassTypeHelper.isOverrider(m5, m0));

		assertFalse(ClassTypeHelper.isOverrider(m0, m1));
		assertFalse(ClassTypeHelper.isOverrider(m1, m1));
		assertFalse(ClassTypeHelper.isOverrider(m3, m1));
		assertTrue(ClassTypeHelper.isOverrider(m2, m1));
		assertTrue(ClassTypeHelper.isOverrider(m4, m1));
		assertTrue(ClassTypeHelper.isOverrider(m5, m1));

		assertFalse(ClassTypeHelper.isOverrider(m0, m2));
		assertFalse(ClassTypeHelper.isOverrider(m1, m2));
		assertFalse(ClassTypeHelper.isOverrider(m2, m2));
		assertFalse(ClassTypeHelper.isOverrider(m3, m2));
		assertFalse(ClassTypeHelper.isOverrider(m5, m2));
		assertTrue(ClassTypeHelper.isOverrider(m4, m2));

		ICPPMethod[] ors = ClassTypeHelper.findOverridden(m0);
		assertEquals(0, ors.length);
		ors = ClassTypeHelper.findOverridden(m1);
		assertEquals(0, ors.length);
		ors = ClassTypeHelper.findOverridden(m2);
		assertEquals(1, ors.length);
		assertEquals(ors[0], m1);
		ors = ClassTypeHelper.findOverridden(m3);
		assertEquals(0, ors.length);
		ors = ClassTypeHelper.findOverridden(m4);
		assertEquals(2, ors.length);
		assertEquals(ors[0], m2);
		assertEquals(ors[1], m1);
		ors = ClassTypeHelper.findOverridden(m5);
		assertEquals(1, ors.length);
		assertEquals(ors[0], m1);
	}

	// class Ret {};
	// Ret operator "" _X(unsigned long long i) { return Ret(); }

	// auto test = 123_X;
	public void testUserDefinedLiteralOperatorTypes1() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(long double i) { return Ret(); }

	// auto test = 12.3_X;
	public void testUserDefinedLiteralOperatorTypes2() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s) { return Ret(); }

	// auto test = 123_X;
	public void testUserDefinedLiteralOperatorTypes1a() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s) { return Ret(); }

	// auto test = 12.3_X;
	public void testUserDefinedLiteralOperatorTypes2a() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(unsigned long long d) { return Ret(); }
	// bool operator "" _X(const char* s) { return false; }

	// auto test = 123_X;
	public void testUserDefinedLiteralOperatorTypes1b() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(long double d) { return Ret(); }
	// bool operator "" _X(const char* s) { return false; }

	// auto test = 12.3_X;
	public void testUserDefinedLiteralOperatorTypes2b() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s, unsigned sz) { return Ret(); }

	// auto test = "123"_X;
	public void testUserDefinedLiteralOperatorTypes3() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const wchar_t* s, unsigned sz) { return Ret(); }

	// auto test = L"123"_X;
	public void testUserDefinedLiteralOperatorTypes3a() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char16_t* s, unsigned sz) { return Ret(); }

	// auto test = u"123"_X;
	public void testUserDefinedLiteralOperatorTypes3b() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char32_t* s, unsigned sz) { return Ret(); }

	// auto test = U"123"_X;
	public void testUserDefinedLiteralOperatorTypes3c() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// template<char... Chars> Ret operator "" _X() { return Ret(); }

	// auto test = 123_X;
	public void testUserDefinedLiteralOperatorTypes4a() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// template<char... Chars> Ret operator "" _X() { return Ret(); }

	// auto test = 123.123_X;
	public void testUserDefinedLiteralOperatorTypes4b() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s, unsigned sz) { return Ret(); }

	// auto test = "123" "123"_X;
	public void testUserDefinedLiteralConcatenation1a() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s, unsigned sz) { return Ret(); }

	// auto test = "123"_X "123";
	public void testUserDefinedLiteralConcatenation1b() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s, unsigned sz) { return Ret(); }

	// auto test = u8"123" "123"_X;
	public void testUserDefinedLiteralConcatenation2a() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s, unsigned sz) { return Ret(); }

	// auto test = u8"123"_X "123";
	public void testUserDefinedLiteralConcatenation2b() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s, unsigned sz) { return Ret(); }

	// auto test = "123" u8"123"_X;
	public void testUserDefinedLiteralConcatenation2c() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s, unsigned sz) { return Ret(); }

	// auto test = "123"_X u8"123";
	public void testUserDefinedLiteralConcatenation2d() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const wchar_t* s, unsigned sz) { return Ret(); }

	// auto test = L"123" "123"_X;
	public void testUserDefinedLiteralConcatenation3a() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const wchar_t* s, unsigned sz) { return Ret(); }

	// auto test = L"123"_X "123";
	public void testUserDefinedLiteralConcatenation3b() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const wchar_t* s, unsigned sz) { return Ret(); }

	// auto test = "123" L"123"_X;
	public void testUserDefinedLiteralConcatenation3c() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const wchar_t* s, unsigned sz) { return Ret(); }

	// auto test = "123"_X L"123";
	public void testUserDefinedLiteralConcatenation3d() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char16_t* s, unsigned sz) { return Ret(); }

	// auto test = u"123" "123"_X;
	public void testUserDefinedLiteralConcatenation4a() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char16_t* s, unsigned sz) { return Ret(); }

	// auto test = u"123"_X "123";
	public void testUserDefinedLiteralConcatenation4b() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char16_t* s, unsigned sz) { return Ret(); }

	// auto test = "123" u"123"_X;
	public void testUserDefinedLiteralConcatenation4c() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char16_t* s, unsigned sz) { return Ret(); }

	// auto test = "123"_X u"123";
	public void testUserDefinedLiteralConcatenation4d() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char32_t* s, unsigned sz) { return Ret(); }

	// auto test = U"123" "123"_X;
	public void testUserDefinedLiteralConcatenation5a() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char32_t* s, unsigned sz) { return Ret(); }

	// auto test = U"123"_X "123";
	public void testUserDefinedLiteralConcatenation5b() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char32_t* s, unsigned sz) { return Ret(); }

	// auto test = "123" U"123"_X;
	public void testUserDefinedLiteralConcatenation5c() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char32_t* s, unsigned sz) { return Ret(); }

	// auto test = "123"_X U"123";
	public void testUserDefinedLiteralConcatenation5d() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char32_t* s, unsigned sz) { return Ret(); }

	// auto test = "123"_X U"123"_X;
	public void testUserDefinedLiteralConcatenation6() throws Exception {
		assertUserDefinedLiteralType("Ret");
	}

	// class Ret {};
	// Ret operator "" _X(const char* s, unsigned sz) { return Ret(); }
	// Ret operator "" _Y(const char* s, unsigned sz) { return Ret(); }

	// auto test = "123"_X "123"_Y;
	public void testUserDefinedLiteralBadConcat1() throws Exception {
		IASTProblem[] problems = strategy.getAst(0).getPreprocessorProblems();
		assertEquals(1, problems.length);
		assertEquals(IProblem.PREPROCESSOR_MULTIPLE_USER_DEFINED_SUFFIXES_IN_CONCATENATION, problems[0].getID());
	}

	// class RetA {};
	// class RetB {};
	// template<char... Chars> RetA operator "" _X() { return RetA(); }
	// RetB operator "" _X(unsigned long long i) { return RetB(); }

	// auto test = 123_X;
	public void testUserDefinedLiteralResolution1() throws Exception {
		assertUserDefinedLiteralType("RetB");
	}

	// class RetA {};
	// class RetB {};
	// template<char... Chars> RetA operator "" _X() { return RetA(); }
	// RetB operator "" _X(long double i) { return RetB(); }

	// auto test = 123.123_X;
	public void testUserDefinedLiteralResolution2() throws Exception {
		assertUserDefinedLiteralType("RetB");
	}

	// class RetA {};
	// class RetB {};
	// template<char... Chars> RetA operator "" _X() { return RetA(); }
	// RetB operator "" _X(const char * c) { return RetB(); }

	// auto test = 123_X;
	public void testUserDefinedLiteralResolution3() throws Exception {
		ICPPVariable v = getBindingFromFirstIdentifier("test");
		assertTrue(v.getType() instanceof IProblemType);
	}

	//	struct A {
	//	    virtual bool foo() = 0;
	//	};
	//
	//	struct B : A {
	//	    bool foo();
	//	};

	//	class B;
	//	int main() {
	//	    B waldo;
	//	}
	public void testFinalOverriderAnalysis_489477() throws Exception {
		ICPPVariable waldo = getBindingFromFirstIdentifier("waldo");
		IType type = waldo.getType();
		assertInstance(type, ICPPClassType.class);
		ICPPMethod[] pureVirtuals = SemanticQueries.getPureVirtualMethods((ICPPClassType) type, null);
		assertEquals(0, pureVirtuals.length);
	}

	//	class A {
	//	  friend class B;
	//	};

	//	B* b;
	public void testFriendClassDeclaration_508338() throws Exception {
		getProblemFromFirstIdentifier("B*");
	}

	//	class waldo {
	//	    static waldo instance;
	//
	//	    constexpr waldo() {}
	//	};
	//
	//	waldo waldo::instance;

	//	// empty file
	public void testStaticFieldOfEnclosingType_508254() throws Exception {
		checkBindings();
	}

	//	namespace {
	//	    struct {} waldo;
	//	}

	//	// empty file
	public void testAnonymousStructInAnonymousNamespace_508254() throws Exception {
		checkBindings();
	}

	//	struct base {
	//	    int* ptr;
	//	};
	//
	//	struct shared_ptr : public base {
	//	    constexpr shared_ptr() {}
	//	    constexpr shared_ptr(int) : shared_ptr() {}
	//	};
	//
	//	struct Foo {
	//	    shared_ptr m_variable = 0;
	//	};

	//	int main() {
	//	    Foo a;  // Error: Type 'Foo' could not be resolved
	//	}
	public void testDelegatingConstructorCallInConstexprConstructor_509871() throws Exception {
		checkBindings();
	}

	//	// empty file

	//	template <typename T>
	//	struct base {
	//	  constexpr base() : p(0) {}
	//	  int p;
	//	};
	//
	//	template <typename T>
	//	struct derived : public base<T> {
	//	  constexpr derived() : base<T>() {}
	//	  constexpr derived(int) : derived() {}
	//	};
	//
	//	class C {};
	//	derived<C> waldo = 0;
	public void testDelegatingConstructorCallInConstexprConstructor_514595() throws Exception {
		checkBindings();
	}

	//	enum class NoneType { None };
	//	const NoneType None = None;

	//	// empty file
	public void testSelfReferencingVariable_510484() throws Exception {
		checkBindings();
	}

	//	class Foo {
	//		struct Bar;
	//		void func();
	//	};

	//	struct Foo::Bar {
	//		Bar(int, int);
	//	};
	//	void Foo::func() {
	//		Bar waldo(0, 0);
	//	}
	public void testNestedClassDefinedOutOfLine_502999() throws Exception {
		checkBindings();
	}

	//	class MyClass
	//	{
	//	public:
	//	    MyClass( int i )
	//	    {
	//	    }
	//	    static const MyClass CONSTANT_NAME1;
	//	    static const MyClass CONSTANT_NAME2;
	//	    static const MyClass CONSTANT_NAME3;
	//	    static const MyClass CONSTANT_NAME4;
	//	    static const MyClass CONSTANT_NAME5;
	//	    static const MyClass CONSTANT_NAME6;
	//	    static const MyClass CONSTANT_NAME7;
	//	    static const MyClass CONSTANT_NAME8;
	//	    static const MyClass CONSTANT_NAME9;
	//	    static const MyClass CONSTANT_NAME10;
	//	    static const MyClass CONSTANT_NAME11;
	//	    static const MyClass CONSTANT_NAME12;
	//	    static const MyClass CONSTANT_NAME13;
	//	    static const MyClass CONSTANT_NAME14;
	//	    static const MyClass CONSTANT_NAME15;
	//	    static const MyClass CONSTANT_NAME16;
	//	    static const MyClass CONSTANT_NAME17;
	//	    static const MyClass CONSTANT_NAME18;
	//	    static const MyClass CONSTANT_NAME19;
	//	    static const MyClass CONSTANT_NAME20;
	//	    static const MyClass CONSTANT_NAME21;
	//	    static const MyClass CONSTANT_NAME22;
	//	    static const MyClass CONSTANT_NAME23;
	//	    static const MyClass CONSTANT_NAME24;
	//	    static const MyClass CONSTANT_NAME25;
	//	    static const MyClass CONSTANT_NAME26;
	//	};
	//
	//	const MyClass MyClass::CONSTANT_NAME1( 1 );
	//	const MyClass MyClass::CONSTANT_NAME2( 2 );
	//	const MyClass MyClass::CONSTANT_NAME3( 3 );
	//	const MyClass MyClass::CONSTANT_NAME4( 4 );
	//	const MyClass MyClass::CONSTANT_NAME5( 5 );
	//	const MyClass MyClass::CONSTANT_NAME6( 6 );
	//	const MyClass MyClass::CONSTANT_NAME7( 7 );
	//	const MyClass MyClass::CONSTANT_NAME8( 8 );
	//	const MyClass MyClass::CONSTANT_NAME9( 9 );
	//	const MyClass MyClass::CONSTANT_NAME10( 10 );
	//	const MyClass MyClass::CONSTANT_NAME11( 11 );
	//	const MyClass MyClass::CONSTANT_NAME12( 12 );
	//	const MyClass MyClass::CONSTANT_NAME13( 13 );
	//	const MyClass MyClass::CONSTANT_NAME14( 14 );
	//	const MyClass MyClass::CONSTANT_NAME15( 15 );
	//	const MyClass MyClass::CONSTANT_NAME16( 16 );
	//	const MyClass MyClass::CONSTANT_NAME17( 17 );
	//	const MyClass MyClass::CONSTANT_NAME18( 18 );
	//	const MyClass MyClass::CONSTANT_NAME19( 19 );
	//	const MyClass MyClass::CONSTANT_NAME20( 20 );
	//	const MyClass MyClass::CONSTANT_NAME21( 21 );
	//	const MyClass MyClass::CONSTANT_NAME22( 22 );
	//	const MyClass MyClass::CONSTANT_NAME23( 23 );
	//	const MyClass MyClass::CONSTANT_NAME24( 24 );
	//	const MyClass MyClass::CONSTANT_NAME25( 25 );
	//	const MyClass MyClass::CONSTANT_NAME26( 26 );

	//	// empty file
	public void testOOM_529646() throws Exception {
		checkBindings();
	}

	//	int foo() noexcept;

	//	constexpr bool is_noexcept = noexcept(foo());
	public void testNoexceptOperator_545021() throws Exception {
		IVariable isNoexcept = getBindingFromASTName("is_noexcept", 11);
		assertEquals(1, isNoexcept.getInitialValue().numberValue().longValue());
	}
}
