1f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek//===- unittests/AST/DeclTest.cpp --- Declaration tests -------------------===// 2f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek// 3f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek// The LLVM Compiler Infrastructure 4f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek// 5f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek// This file is distributed under the University of Illinois Open Source 6f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek// License. See LICENSE.TXT for details. 7f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek// 8f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek//===----------------------------------------------------------------------===// 9f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek// 10f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek// Unit tests for Decl nodes in the AST. 11f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek// 12f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek//===----------------------------------------------------------------------===// 13f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek 14f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek#include "clang/ASTMatchers/ASTMatchFinder.h" 15f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek#include "clang/Tooling/Tooling.h" 16f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek#include "gtest/gtest.h" 17f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek 18f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimekusing namespace clang::ast_matchers; 19f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimekusing namespace clang::tooling; 20f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek 21f0f353b36f173ea282209070fcdbbedab84c19dbManuel KlimekTEST(Decl, CleansUpAPValues) { 22f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek MatchFinder Finder; 23f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek llvm::OwningPtr<FrontendActionFactory> Factory( 24f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek newFrontendActionFactory(&Finder)); 25f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek 26f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek // This is a regression test for a memory leak in APValues for structs that 27f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek // allocate memory. This test only fails if run under valgrind with full leak 28f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek // checking enabled. 29f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek std::vector<std::string> Args(1, "-std=c++11"); 304b9b292074b56e8cf2e72c2ef70ec59e5356a02aNAKAMURA Takumi Args.push_back("-fno-ms-extensions"); 31f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek ASSERT_TRUE(runToolOnCodeWithArgs( 32f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek Factory->create(), 33f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "struct X { int a; }; constexpr X x = { 42 };" 34f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "union Y { constexpr Y(int a) : a(a) {} int a; }; constexpr Y y = { 42 };" 35f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr int z[2] = { 42, 43 };" 36f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr int __attribute__((vector_size(16))) v1 = {};" 37c69e1733cdcf74cde52f596310dd8d07eb28e585Benjamin Kramer "\n#ifdef __SIZEOF_INT128__\n" 38f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr __uint128_t large_int = 0xffffffffffffffff;" 39f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr __uint128_t small_int = 1;" 40c69e1733cdcf74cde52f596310dd8d07eb28e585Benjamin Kramer "\n#endif\n" 41f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr double d1 = 42.42;" 42f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr long double d2 = 42.42;" 43f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr _Complex long double c1 = 42.0i;" 44f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr _Complex long double c2 = 42.0;" 45f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "template<int N> struct A : A<N-1> {};" 46f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "template<> struct A<0> { int n; }; A<50> a;" 47f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr int &r = a.n;" 48f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr int A<50>::*p = &A<50>::n;" 49f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "void f() { foo: bar: constexpr int k = __builtin_constant_p(0) ?" 50f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek " (char*)&&foo - (char*)&&bar : 0; }", 51f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek Args)); 52f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek 53f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek // FIXME: Once this test starts breaking we can test APValue::needsCleanup 54f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek // for ComplexInt. 55f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek ASSERT_FALSE(runToolOnCodeWithArgs( 56f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek Factory->create(), 57f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "constexpr _Complex __uint128_t c = 0xffffffffffffffff;", 58f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek Args)); 59f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek} 60