rsmith added inline comments.

================
Comment at: include/clang/Sema/Sema.h:4040-4041
   // explicit nested-name-specifier).
-  void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
+  void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse,
+                             CXXScopeSpec *SS = nullptr, Expr *E = nullptr);
   void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func,
----------------
Pass in the FoundDecl instead of a scope specifier and an expression.


================
Comment at: lib/Sema/SemaDeclCXX.cpp:15520-15525
+  while ((NA = dyn_cast<NamespaceAliasDecl>(ND)) && !NA->isReferenced()) {
+    NA->setReferenced();
+    ND = NA->getAliasedNamespace();
+    if (auto *NNS = NA->getQualifier())
+      MarkNamespaceAliasReferenced(NNS->getAsNamespaceAlias());
+  }
----------------
This is not the right approach. You should not iteratively mark namespaces as 
referenced here. Instead, when we parse the first namespace alias declaration 
in the chain, *it* should mark the subsequent one referenced immediately. So:

```
namespace A { int n; }
namespace B = A; // this declaration marks A referenced
namespace C = B; // this declaration marks B referenced
int k = C::n; // parsing the nested-name-specifier of this expression marks C 
referenced
```


================
Comment at: lib/Sema/SemaDeclCXX.cpp:15531-15586
+void Sema::MarkUsingReferenced(NamedDecl *ND, SourceLocation Loc,
+                               CXXScopeSpec *SS, Expr *E) {
+  // The declaration was not defined in a namespace.
+  auto *DC = ND->getDeclContext();
+  if (!DC->isNamespace())
+    return;
+
----------------
You should not do any of this. You should keep track of how each name was 
actually originally found, and mark the FoundDecl as referenced. Do not attempt 
to redo the lookup like you do here. You will get it wrong, and in any case, 
redoing the lookup is wasteful.


https://reviews.llvm.org/D46190



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to