aaron.ballman added inline comments.

================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:3696-3697
+
+    if (E->isValueDependent() || E->isTypeDependent())
+      continue;
+
----------------
Should this move up above the point where we're checking whether the expression 
has an array type?


================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:3706
+
+    if (!Result || !Notes.empty()) {
+      Diag(E->getBeginLoc(), diag::err_attribute_argument_n_type)
----------------
I'm surprised that the presence of notes alone would mean the attribute 
argument has an error and should be skipped. Are there circumstances under 
which `Result` is true but `Notes` is non-empty?


================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:3693
+    if (E->isValueDependent() || E->isTypeDependent() ||
+        (CE && CE->hasAPValueResult()))
+      continue;
----------------
Tyker wrote:
> aaron.ballman wrote:
> > What is the rationale for bailing out when the constant expression has an 
> > `APValue` result?
> the intent was that during nested template instantiation arguement will be 
> evaluated as soon as they are neither value nor type dependent and the result 
> will be stored in the ConstantExpr. if an arguement has already been 
> evaluated in a previous instantiation we don't want to evaluate it again.
> but because of SubstExpr ConstantExpr are getting removed so it removed it.
Ah, thank you for the explanation and change.


================
Comment at: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:195
+      return;
+    else
+      Args.push_back(Result.get());
----------------
No `else` after a `return`.


================
Comment at: clang/test/SemaCXX/attr-annotate.cpp:96
+}
+
+void test() {}
----------------
Some more tests for various constant expression situations that may be weird:
```
int n = 10;
int vla[n];

[[clang::annotate("vlas are awful", sizeof(vla[++n]))] int i = 0; // reject, 
the sizeof is not unevaluated

[[clang::annotate("_Generic selection expression should be fine", _Generic(n, 
int : 0, default : 1))]] int j = 0; // second arg should resolve to 0 fine

void designator();
[[clang::annotate("function designators?", designator)]] int k = 0; // Should 
work?
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D88645/new/

https://reviews.llvm.org/D88645

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

Reply via email to