[PATCH] D36368: Fix type printing of array template args
John McCall via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 29 11:42:02 PDT 2021
rjmccall added inline comments.
================
Comment at: clang/lib/AST/TemplateBase.cpp:109
+ }
+ return true;
+}
----------------
reikdas wrote:
> rjmccall wrote:
> > Hmm. This seems unnecessarily complex. Oh, and I think I suggested the comparison wrong for pointer depth.
> >
> > Is there a case where the following doesn't work?
> >
> > ```
> > static unsigned getArrayDepth(QualType type) {
> > unsigned count = 0;
> > while (const auto *arrayType = type->getAsArrayTypeUnsafe()) {
> > count++;
> > type = arrayType->getElementType();
> > }
> > return count;
> > }
> >
> > static bool needsAmpersandOnTemplateArg(QualType paramType, QualType argType,
> > ASTContext &Ctx) {
> > if (!paramType->isPointerType())
> > return false;
> > if (argType->isFunctionType())
> > return true;
> > if (argType->isArrayType())
> > return getArrayDepth(argType) < getArrayDepth(paramType->getPointeeType());
> > return false;
> > }
> > ```
> Many tests fail with this.
>
> For eg., the tests added to `SemaTemplate/temp_arg_nontype_cxx11.cpp`
>
>
> ```
>
> ********************
> FAIL: Clang :: SemaTemplate/temp_arg_nontype_cxx11.cpp (13255 of 27894)
> ******************** TEST 'Clang :: SemaTemplate/temp_arg_nontype_cxx11.cpp' FAILED ********************
> Script:
> --
> : 'RUN: at line 1'; /home/reik/llvm-project/build/bin/clang -cc1 -internal-isystem /home/reik/llvm-project/build/lib/clang/13.0.0/include -nostdsysteminc -fsyntax-only -verify -std=c++11 /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp
> --
> Exit Code: 1
>
> Command Output (stderr):
> --
> error: 'error' diagnostics expected but not seen:
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 102: <&kEta,
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 103: <&kDes,
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 104: <&kEta,
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 105: <&kDes,
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 106: <&kNull,
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 108: <&kZero,
> error: 'error' diagnostics seen but not expected:
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 102: no member named 'ls' in 'Folumn<kEta, double>'
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 103: no member named 'ls' in 'Folumn<kDes, double>'
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 104: no member named 'ls' in 'Golumn<kEta, double>'
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 105: no member named 'ls' in 'Golumn<kDes, double>'
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 106: no member named 'ls' in 'Holumn<kNull, double>'
> File /home/reik/llvm-project/clang/test/SemaTemplate/temp_arg_nontype_cxx11.cpp Line 108: no member named 'ls' in 'Iolumn<kZero, double>'
> 12 errors generated.
>
> --
> ```
>
>
Oh yes, sorry, my logic was quite wrong. Try this:
```
static bool needsAmpersandOnTemplateArg(QualType paramType, QualType argType,
ASTContext &Ctx) {
// Generally, if the parameter type is a pointer, we must be taking the address of
// something and need a &. However, if the argument is an array, this could be
// implicit via array-to-pointer decay.
if (!paramType->isPointerType())
return false;
if (argType->isArrayType())
return getArrayDepth(argType) == getArrayDepth(paramType->getPointeeType());
return true;
}
```
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D36368/new/
https://reviews.llvm.org/D36368
More information about the llvm-commits
mailing list