From c86b984ea8ecb3e944dc3de48539f4c1f65851ea Mon Sep 17 00:00:00 2001 From: dim Date: Sun, 18 Jan 2015 16:23:48 +0000 Subject: Vendor import of clang RELEASE_360/rc1 tag r226102 (effectively, 3.6.0 RC1): https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_360/rc1@226102 --- test/Modules/merge-using-decls.cpp | 69 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 test/Modules/merge-using-decls.cpp (limited to 'test/Modules/merge-using-decls.cpp') diff --git a/test/Modules/merge-using-decls.cpp b/test/Modules/merge-using-decls.cpp new file mode 100644 index 0000000..3b84d0e --- /dev/null +++ b/test/Modules/merge-using-decls.cpp @@ -0,0 +1,69 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -x c++ -I%S/Inputs/merge-using-decls -verify %s -DORDER=1 +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -x c++ -I%S/Inputs/merge-using-decls -verify %s -DORDER=2 + +#if ORDER == 1 +#include "a.h" +#include "b.h" +#else +#include "b.h" +#include "a.h" +#endif + +struct Y { + int value; // expected-note 0-1{{target of using}} + typedef int type; // expected-note 0-1{{target of using}} +}; + +template int Use() { + int k = T().v + T().value; // expected-note 0-2{{instantiation of}} + typedef typename T::type I; + typedef typename T::t I; + typedef int I; + return k; +} + +template int UseAll() { + return Use >() + Use >() + Use >() + Use >(); // expected-note 0-2{{instantiation of}} +} + +template int UseAll(); +template int UseAll(); +template int UseAll(); + +#if ORDER == 1 +// Here, we're instantiating the definition from 'A' and merging the definition +// from 'B' into it. + +// expected-error@b.h:* {{'E::value' from module 'B' is not present in definition of 'E' in module 'A'}} +// expected-error@b.h:* {{'E::v' from module 'B' is not present in definition of 'E' in module 'A'}} + +// expected-error@b.h:* {{'F::type' from module 'B' is not present in definition of 'F' in module 'A'}} +// expected-error@b.h:* {{'F::t' from module 'B' is not present in definition of 'F' in module 'A'}} +// expected-error@b.h:* {{'F::value' from module 'B' is not present in definition of 'F' in module 'A'}} +// expected-error@b.h:* {{'F::v' from module 'B' is not present in definition of 'F' in module 'A'}} + +// expected-note@a.h:* +{{does not match}} +#else +// Here, we're instantiating the definition from 'B' and merging the definition +// from 'A' into it. + +// expected-error@a.h:* {{'D::type' from module 'A' is not present in definition of 'D' in module 'B'}} +// expected-error@a.h:* {{'D::value' from module 'A' is not present in definition of 'D' in module 'B'}} +// expected-error@b.h:* 2{{'typename' keyword used on a non-type}} +// expected-error@b.h:* 2{{dependent using declaration resolved to type without 'typename'}} + +// expected-error@a.h:* {{'E::type' from module 'A' is not present in definition of 'E' in module 'B'}} +// expected-error@a.h:* {{'E::t' from module 'A' is not present in definition of 'E' in module 'B'}} +// expected-error@a.h:* {{'E::value' from module 'A' is not present in definition of 'E' in module 'B'}} +// expected-error@a.h:* {{'E::v' from module 'A' is not present in definition of 'E' in module 'B'}} +// expected-note@b.h:* 2{{definition has no member}} + +// expected-error@a.h:* {{'F::type' from module 'A' is not present in definition of 'F' in module 'B'}} +// expected-error@a.h:* {{'F::t' from module 'A' is not present in definition of 'F' in module 'B'}} +// expected-error@a.h:* {{'F::value' from module 'A' is not present in definition of 'F' in module 'B'}} +// expected-error@a.h:* {{'F::v' from module 'A' is not present in definition of 'F' in module 'B'}} + +// expected-note@b.h:* +{{does not match}} +// expected-note@b.h:* +{{target of using}} +#endif -- cgit v1.1