Don't destroy MacroInfos if we find the macro definition is invalid; it'll get
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 3 Aug 2014 23:41:04 +0000 (23:41 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 3 Aug 2014 23:41:04 +0000 (23:41 +0000)
destroyed on shutdown regardless. Fixes a double-delete.

llvm-svn: 214675

clang/include/clang/Lex/Preprocessor.h
clang/lib/Lex/PPDirectives.cpp
clang/test/Lexer/string-literal-errors.cpp

index 47a10fb..f61ba9e 100644 (file)
@@ -1378,11 +1378,6 @@ private:
   VisibilityMacroDirective *AllocateVisibilityMacroDirective(SourceLocation Loc,
                                                              bool isPublic);
 
-  /// \brief Release the specified MacroInfo for re-use.
-  ///
-  /// This memory will  be reused for allocating new MacroInfo objects.
-  void ReleaseMacroInfo(MacroInfo* MI);
-
   /// \brief Lex and validate a macro name, which occurs after a
   /// \#define or \#undef. 
   ///
index da50bba..6b99ce6 100644 (file)
@@ -90,13 +90,6 @@ Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
   return new (BP) VisibilityMacroDirective(Loc, isPublic);
 }
 
-/// \brief Clean up a MacroInfo that was allocated but not used due to an
-/// error in the macro definition.
-void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {
-  // Don't try to reuse the storage; this only happens on error paths.
-  MI->~MacroInfo();
-}
-
 /// \brief Read and discard all tokens remaining on the current line until
 /// the tok::eod token is found.
 void Preprocessor::DiscardUntilEndOfDirective() {
@@ -1902,8 +1895,6 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok,
     // This is a function-like macro definition.  Read the argument list.
     MI->setIsFunctionLike();
     if (ReadMacroDefinitionArgList(MI, LastTok)) {
-      // Forget about MI.
-      ReleaseMacroInfo(MI);
       // Throw away the rest of the line.
       if (CurPPLexer->ParsingPreprocessorDirective)
         DiscardUntilEndOfDirective();
@@ -2028,7 +2019,6 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok,
           continue;
         } else {
           Diag(Tok, diag::err_pp_stringize_not_parameter);
-          ReleaseMacroInfo(MI);
 
           // Disable __VA_ARGS__ again.
           Ident__VA_ARGS__->setIsPoisoned(true);
@@ -2056,12 +2046,10 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok,
   if (NumTokens != 0) {
     if (MI->getReplacementToken(0).is(tok::hashhash)) {
       Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
-      ReleaseMacroInfo(MI);
       return;
     }
     if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
       Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
-      ReleaseMacroInfo(MI);
       return;
     }
   }
index d8e2993..223dca4 100644 (file)
@@ -23,3 +23,5 @@ void foo() {
   // CHECK: {{^       \^~$}}
   // CHECK: {{^          \^~$}}
 }
+
+#define foo() lots and lots of tokens, need at least 8 to fill up the smallvector buffer #BadThingsHappenNow