[PATCH] D64644: [Sema] Fixes an assertion failure while instantiation a template with an incomplete typo corrected type
Mark de Wever via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Aug 31 07:04:53 PDT 2019
Mordante updated this revision to Diff 218221.
Mordante retitled this revision from "Fixes an assertion failure while instantiation a template with an incomplete typo corrected type" to "[Sema] Fixes an assertion failure while instantiation a template with an incomplete typo corrected type".
Mordante added a comment.
Update bug number references:
- Removed from the source
- Use PR35682 in the test
Note: I tried to use `-verify` instead of `FileCheck` but that doesn't seem to work well since `-ferror-limit 1` reports no line number. Other tests with `-ferror-limit 1` also use `FileCheck`.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D64644/new/
https://reviews.llvm.org/D64644
Files:
clang/lib/Sema/SemaTemplate.cpp
clang/test/SemaTemplate/instantiate-incomplete-typo-suggested-error-limit.cpp
Index: clang/test/SemaTemplate/instantiate-incomplete-typo-suggested-error-limit.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaTemplate/instantiate-incomplete-typo-suggested-error-limit.cpp
@@ -0,0 +1,60 @@
+// RUN: not %clang -fsyntax-only -std=c++11 -ferror-limit=1 %s 2>&1 | FileCheck %s
+
+// Test case for PR35682.
+// The issue be caused by the typo correction that changes String to the
+// incomplete type string. The example is based on the std::pair code and
+// reduced to a minimal test case. When using std::pair the issue can only be
+// reproduced when using the -stdlib=libc++ compiler option.
+
+template <class T> class allocator;
+
+template <class charT> struct char_traits;
+
+template <class CharT, class Traits = char_traits<CharT>,
+ class Allocator = allocator<CharT>>
+class basic_string;
+typedef basic_string<char, char_traits<char>, allocator<char>> string;
+
+template <bool, class Tp = void> struct enable_if {};
+template <class Tp> struct enable_if<true, Tp> { typedef Tp type; };
+
+template <class Tp, Tp v> struct integral_constant {
+ static constexpr const Tp value = v;
+ typedef Tp value_type;
+ typedef integral_constant type;
+
+ constexpr operator value_type() const noexcept { return value; }
+ constexpr value_type operator()() const noexcept { return value; }
+};
+
+template <class Tp, Tp v> constexpr const Tp integral_constant<Tp, v>::value;
+
+using true_type = integral_constant<bool, true>;
+using false_type = integral_constant<bool, false>;
+
+template <class Tp, class Up> struct is_same : public false_type {};
+template <class Tp> struct is_same<Tp, Tp> : public true_type {};
+
+template <class T> struct single {
+ typedef T first_type;
+
+ T first;
+
+ struct CheckArgs {
+ template <class U1> static constexpr bool enable_implicit() {
+ return is_same<first_type, U1>::value;
+ }
+ };
+
+ template <class U1,
+ typename enable_if<CheckArgs::template enable_implicit<U1>(),
+ bool>::type = false>
+ single(U1 &&u1);
+};
+
+using SetKeyType = String;
+single<SetKeyType> v;
+
+// CHECK: error: unknown type name 'String'; did you mean 'string'?
+// CHECK: fatal error: too many errors emitted, stopping now [-ferror-limit=]
+// CHECK-NOT: Assertion{{.*}}failed
Index: clang/lib/Sema/SemaTemplate.cpp
===================================================================
--- clang/lib/Sema/SemaTemplate.cpp
+++ clang/lib/Sema/SemaTemplate.cpp
@@ -718,9 +718,13 @@
SourceLocation TemplateKWLoc,
const DeclarationNameInfo &NameInfo,
const TemplateArgumentListInfo *TemplateArgs) {
+ // DependentScopeDeclRefExpr::Create requires a valid QualifierLoc
+ NestedNameSpecifierLoc QualifierLoc = SS.getWithLocInContext(Context);
+ if (!QualifierLoc)
+ return ExprError();
+
return DependentScopeDeclRefExpr::Create(
- Context, SS.getWithLocInContext(Context), TemplateKWLoc, NameInfo,
- TemplateArgs);
+ Context, std::move(QualifierLoc), TemplateKWLoc, NameInfo, TemplateArgs);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D64644.218221.patch
Type: text/x-patch
Size: 3187 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190831/f99cb1de/attachment.bin>
More information about the cfe-commits
mailing list