]> granicus.if.org Git - clang/commitdiff
[modules] When parsing the base specifiers of a parse-merged class, the current
authorRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 17 Aug 2015 20:24:17 +0000 (20:24 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 17 Aug 2015 20:24:17 +0000 (20:24 +0000)
context is the class itself but lookups should be performed starting with the
lookup parent of the class (class and base members don't shadow types from the
surrounding context because they have not been declared yet).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@245236 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/Modules/Inputs/submodules-merge-defs/defs.h
test/Modules/Inputs/template-default-args/a.h
test/Modules/submodules-merge-defs.cpp
test/Modules/template-default-args.cpp

index 9282ecad4cbcbee5db797f3f30b5bb6342570409..a8d1e1203e45a1fce7afb2a1d55cf2a1238dce6c 100644 (file)
@@ -1089,7 +1089,9 @@ Sema::SkippedDefinitionContext Sema::ActOnTagStartSkippedDefinition(Scope *S,
   auto Result = static_cast<SkippedDefinitionContext>(CurContext);
   CurContext = cast<TagDecl>(D)->getDefinition();
   assert(CurContext && "skipping definition of undefined tag");
-  S->setEntity(CurContext);
+  // Start lookups from the parent of the current context; we don't want to look
+  // into the pre-existing complete definition.
+  S->setEntity(CurContext->getLookupParent());
   return Result;
 }
 
index ba6956fb98dc38deac6b7cab7268c690c769f2ce..e9d7284719130b7bd98167b4e3b254f577342ec0 100644 (file)
@@ -5,10 +5,17 @@ class B {
   struct Inner1 {};
 public:
   struct Inner2;
+  struct Inner3;
   template<typename T> void f();
 };
+struct BFriend {
+  friend class B::Inner3;
+private:
+  struct Inner3Base {};
+};
 // Check that lookup and access checks are performed in the right context.
 struct B::Inner2 : Inner1 {};
+struct B::Inner3 : BFriend::Inner3Base {};
 template<typename T> void B::f() {}
 template<> inline void B::f<int>() {}
 
index 19c80549d1ceb147eb601bf6fe9948d10bd710fc..a8a01a9e31304a1c8b66488d99fedea98b2462f9 100644 (file)
@@ -6,4 +6,7 @@ template<typename T> struct D;
 template<typename T> struct E;
 template<typename T = int> struct G;
 template<typename T = int> struct H;
+template<typename T> struct J {};
+template<typename T = int> struct J;
+struct K : J<> {};
 END
index 62cbbd51098696c65a9b717fa9d8b1cbc32bf668..6a46e6dfa8a47b858df6d48d2f5d18bbcad2efcf 100644 (file)
@@ -26,38 +26,38 @@ int pre_use_a = use_a(pre_a); // expected-error {{'A' must be imported}} expecte
 
 B::Inner2 pre_bi; // expected-error +{{must be imported}}
 // expected-note@defs.h:4 +{{here}}
-// expected-note@defs.h:11 +{{here}}
+// expected-note@defs.h:17 +{{here}}
 void pre_bfi(B b) { // expected-error {{must use 'class'}} expected-error +{{must be imported}}
   b.f<int>(); // expected-error +{{must be imported}} expected-error +{{}}
-  // expected-note@defs.h:12 +{{here}}
+  // expected-note@defs.h:19 +{{here}}
 }
 
 C_Base<1> pre_cb1; // expected-error +{{must be imported}}
-// expected-note@defs.h:16 +{{here}}
+// expected-note@defs.h:23 +{{here}}
 C1 pre_c1; // expected-error +{{must be imported}} expected-error {{must use 'struct'}}
-// expected-note@defs.h:18 +{{here}}
+// expected-note@defs.h:25 +{{here}}
 C2 pre_c2; // expected-error +{{must be imported}} expected-error {{must use 'struct'}}
-// expected-note@defs.h:19 +{{here}}
+// expected-note@defs.h:26 +{{here}}
 
 D::X pre_dx; // expected-error +{{must be imported}}
-// expected-note@defs.h:21 +{{here}}
-// expected-note@defs.h:22 +{{here}}
+// expected-note@defs.h:28 +{{here}}
+// expected-note@defs.h:29 +{{here}}
 // FIXME: We should warn that use_dx is being used without being imported.
 int pre_use_dx = use_dx(pre_dx);
 
 int pre_e = E(0); // expected-error {{must be imported}}
-// expected-note@defs.h:25 +{{here}}
+// expected-note@defs.h:32 +{{here}}
 
 int pre_ff = F<int>().f(); // expected-error +{{must be imported}}
 int pre_fg = F<int>().g<int>(); // expected-error +{{must be imported}}
-// expected-note@defs.h:27 +{{here}}
+// expected-note@defs.h:34 +{{here}}
 
 G::A pre_ga // expected-error +{{must be imported}}
   = G::a; // expected-error +{{must be imported}}
-// expected-note@defs.h:42 +{{here}}
-// expected-note@defs.h:43 +{{here}}
+// expected-note@defs.h:49 +{{here}}
+// expected-note@defs.h:50 +{{here}}
 decltype(G::h) pre_gh = G::h; // expected-error +{{must be imported}}
-// expected-note@defs.h:44 +{{here}}
+// expected-note@defs.h:51 +{{here}}
 
 J<> pre_j; // expected-error {{declaration of 'J' must be imported}}
 #ifdef IMPORT_USE_2
@@ -67,10 +67,10 @@ J<> pre_j; // expected-error {{declaration of 'J' must be imported}}
 #else
 // expected-error@-6 {{default argument of 'J' must be imported from module 'stuff.use'}}
 #endif
-// expected-note@defs.h:51 +{{here}}
+// expected-note@defs.h:58 +{{here}}
 
 ScopedEnum pre_scopedenum; // expected-error {{must be imported}} expected-error {{must use 'enum'}}
-// expected-note@defs.h:99 {{here}}
+// expected-note@defs.h:106 {{here}}
 enum ScopedEnum : int;
 ScopedEnum pre_scopedenum_declared; // ok
 
index c2a6ddca2d7d68e027fc91593d7e5cade3f10396..3a519f2d8a7c53d6172c4722ee13c7b9c869e0e1 100644 (file)
@@ -22,6 +22,9 @@ template<typename T = int> struct C;
 template<typename T> struct D {};
 template<typename T> struct F {};
 template<typename T> struct G {};
+template<typename T> struct J {};
+template<typename T = int> struct J;
+struct K : J<> {};
 END
 
 #include "c.h"