rsmith added inline comments.

================
Comment at: lib/Parse/ParseTemplate.cpp:1203-1204
+  {
+    EnterExpressionEvaluationContext EnterConstantEvaluated(
+        Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated);
+    if (isCXXTypeId(TypeIdAsTemplateArgument)) {
----------------
Please add a comment here, something like:

isCXXTypeId might look up and annotate an identifier as an id-expression during 
disambiguation, so enter the appropriate context for a constant expression 
template argument before trying to disambiguate.


================
Comment at: lib/Parse/ParseTemplate.cpp:1214-1243
+    } else {
+      // If we disambiguated as an expression that we identified as potentially
+      // not being odr-used (consistent with a template argument context), and
+      // annotated our token as that expression, then remove it from the
+      // MaybeODRUsedExprs so that it doesn't trigger a false error, since it
+      // would otherwise have been removed when completing processing of a
+      // constant expression.
----------------
... we shouldn't need to do any of this: instead, keep your 
`ExprEvaluationContext` alive through the call to `ParseConstantExpression`, 
and tell it to not create its own context in this case.


================
Comment at: lib/Parse/ParseTemplate.cpp:1234-1237
+        // it for later since we can be certain that this expression would
+        // eventually have been removed during ActOnConstantExpression called
+        // from ParseConstantExpression when parsing the non-type template
+        // argument below.  Eitherway, the appropriate checking for an
----------------
This doesn't seem right. If the template parameter is of reference type, the 
named entity should be considered to be odr-used. And likewise just because we 
stopped disambiguation after finding an id-expression that names a non-type, 
that does not imply that the overall template argument is the entity named by 
that id-expression. (Eg, consider `X<F()>`, where `F` is a functor whose 
`operator()` returns `this` -- that template argument should be considered to 
odr-use `F`.) But...


Repository:
  rL LLVM

https://reviews.llvm.org/D31588



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

Reply via email to